我试图制作一个由按钮组成的乘法表,这些按钮上的数学事实在按下时会变为乘积,然后在再次按下时会返回到事实。得到了第一部分,但不知道如何使它返回到原始按钮设置。我的程序分为2类。首先创建按钮,并用原始事实填充它们。使用嵌套循环将文本(数学事实)写在按钮上。
import java.awt.ComponentOrientation;
import java.awt.GridLayout;
import javax.swing.JPanel;
import javax.swing.JFrame;
public class Grid {
public static void main(String args[]){
JFrame frame = new JFrame("Grid Layout");
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 600);
frame.setResizable(false);
JPanel panel = new JPanel();
panel.setLayout(new GridLayout (9, 9, 5, 5));
panel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
int i, j;
for (i = 1; i<=9; i++){
for (j = 1; j <= 9; j++){
FactButton button =new FactButton();
button.setText(i + " x " + j);
panel.add(button);
}
}
frame.add(panel);
}
}
第二类定义了按下按钮时的功能。我提出了两种情况。第一个是默认设置,第二个将按钮更改为展示产品。第一次按下时效果很好。第二次按下按钮时,我收到错误消息,但没有任何变化。我可以将第一种情况更改为基于
按钮在面板上的位置(列,行)?我该怎么做呢?还有其他建议吗?
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.Color;
import java.awt.event.ActionEvent;
public class FactButton extends JButton implements ActionListener{
private static final long serialVersionUID = 1L;
public FactButton() {
this.addActionListener(this);
}
public void actionPerformed(ActionEvent e){
String prob = this.getText();
String left = prob.substring(0, prob.indexOf(" "));
String right = prob.substring(prob.indexOf(" ")+3, prob.length() );
int i = Integer.parseInt(left);
int j = Integer.parseInt(right);
int v=0;
v++;
v%=2;
switch(v){
case 0:
this.setText(null);
break;
case 1:
this.setText(i*j+"");
this.setBackground(Color.WHITE);
this.setContentAreaFilled(false);
this.setOpaque(true);
break;
}
}
}
首次按下时将切换到产品。中断第二。以为会回到空白按钮。我怎样才能显示原始的数学事实?
最佳答案
将数字保留在FactButton
中作为成员。然后,您可以随时使用它们。在当前情况下,您正在从按钮文本中解析数字。但是在第一次单击后,按钮的文本已更改。因此,您将丢失实例化期间设置的数字。
以此更改您的FactButton
:
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.Color;
import java.awt.event.ActionEvent;
public class FactButton extends JButton implements ActionListener {
private final static int PRODUCT_STATE = 0;
private final static int FACT_STATE = 1;
private int buttonState = FACT_STATE;
private int firstNumber;
private int secondNumber;
public FactButton(int firstNumber, int secondNumber) {
this.firstNumber = firstNumber;
this.secondNumber = secondNumber;
this.setText(firstNumber + " x " + secondNumber);
this.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
switch (buttonState) {
case PRODUCT_STATE:
this.setText(firstNumber + " x " + secondNumber);
this.setBackground(null);
this.setContentAreaFilled(true);
buttonState = FACT_STATE;
break;
case FACT_STATE:
this.setText(firstNumber * secondNumber + "");
this.setBackground(Color.WHITE);
this.setContentAreaFilled(false);
this.setOpaque(true);
buttonState = PRODUCT_STATE;
break;
}
}
}
并且不要在实例化后设置按钮的文本。像这样做:
FactButton button =new FactButton(i, j);
//not needed
//button.setText(i + " x " + j);
panel.add(button);