0

言归正传,我无法从外部 ActionListener 类中写入静态双变量或 JTextField。我正在制作一个高级计算器,为了让事情变得更简单,我正在尝试创建 GUI,实现其按钮和其他功能,并且我正在尝试将 ActionListeners 放在另一个类中。在 Eclipse 中,它说我需要将计算器的变量设为静态,但将它们设为静态,我无法再给它们写信并显示答案。这是我的代码:

public static JButton num0, num1, num2, num3, num4, num5, num6, num7, num8, num9;
public static double tempNum1;
public static double tempNum2;
public static boolean pointOn = false;
public static int APC = 1;

public GUI(){
    GUINumListener numListener = new GUINumListener();

    num0.addActionListener(numListener);
    num1.addActionListener(numListener);
    num2.addActionListener(numListener);
    num3.addActionListener(numListener);
    num4.addActionListener(numListener);
    num5.addActionListener(numListener);
    num6.addActionListener(numListener);
    num7.addActionListener(numListener);
    num8.addActionListener(numListener);
    num9.addActionListener(numListener);
}

在 GUINumListener 类中:

public class GUINumListener implements ActionListener{
    public void actionPerformed(ActionEvent e){
        if (e.getActionCommand().equals(GUI.num0)){
            GUI.tempNum2 *= 10;
        }else if (e.getActionCommand().equals(GUI.num1)){
            if (GUI.pointOn = false){
                GUI.tempNum2 = (GUI.tempNum2 * 10) + 1;
            }else{
                GUI.tempNum2 = (GUI.tempNum2 * Math.pow(10, GUI.APC) + 1) / Math.pow(10, GUI.APC);
                GUI.APC++;
            }
            GUI.ansField.setText(Double.toString(GUI.tempNum2));
        }
    }

在程序中单击一个数字不会在 ansField 字段中输出它。帮助!谢谢

4

2 回答 2

1

问题是您的if支票:e.getActionCommand().equals(GUI.num0)

getActionCommand()返回 aString并且num0是 a JButton。所以equals总是会返回false,因为它们不是同一个类类型。

解决此问题的一种方法是检查按钮的标签:getActionCommand()

所以if声明应该是:

e.getActionCommand().equals(GUI.num0.getActionCommand())

于 2013-07-13T14:40:24.667 回答
1

不要使用静态字段,还要封装它们。

因为ActionListener如果唯一的范围是外部类或Anoymous Classes.

此外,您似乎有一个 Button 集合,您可以考虑分组到集合中。

示例(我在代码中评论):

private List<JButton> buttons;
private double tempNum1;
private double tempNum2;
private boolean pointOn = false;
private int APC = 1; 
//make them private why public and static? 


public GUI(){
    ActionListener numListener = new GUINumListener();

    //initiliatze buttons  

    int size=10;
    buttons= new ArrayList<>(size);

    for(int i=0;i<size;i++){
         JButton button = new JButton();
         button.addActionListener(numListener);
         buttons.add(button);             
    } 

}


private class GUINumListener implements ActionListener{
 @Override
 public void actionPerformed(ActionEvent e){
        if (e.getSource() == buttons.get(0)){ // actionCommand returns string you have to use getSource() or setting an actionCommand to the button and compare num0.getActionCommand()
             tempNum2 *= 10;
        }else if (e.getSource() == buttons.get(1)){
            if (!pointOn){ // u were assigning pointOn = false
                tempNum2 = (tempNum2 * 10) + 1;
            }else{
                tempNum2 = (tempNum2 * Math.pow(10, APC) + 1) / Math.pow(10, APC);
                APC++;
            }
            ansField.setText(Double.toString(tempNum2));
        }

}
于 2013-07-13T14:43:53.660 回答