我试图制作一个由按钮组成的乘法表,这些按钮上的数学事实在按下时会变为乘积,然后在再次按下时会返回到事实。得到了第一部分,但不知道如何使它返回到原始按钮设置。我的程序分为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);

10-02 00:20
查看更多