【问题标题】:JButton ActionListeners different variable in each loopJButton ActionListeners 每个循环中的不同变量
【发布时间】:2018-12-07 15:19:25
【问题描述】:

我正在使用 JFrame 和 JButtons 制作一个简单的计算器。在我用自己的动作监听器制作每个按钮之前,从 0 到 9,现在我已经意识到这是非常低效的,我应该使用循环来制作每个按钮并分配 ActionListeners。因此,在每个 ActionListener 中唯一需要做的就是将按钮的任何数字添加到 JTextField,称为 nums。这是我现在所拥有的。

for(int i = 0; i <=9; i++) {
        count = i;
        btns.get(i).addActionListener(new ActionListener(){ //makes action listeners for each button
            public void actionPerformed(ActionEvent e){ 

                    nums.setText(nums.getText()+ count);//IMPORTANT CODE

            }       
        });
      }

如您所见,我使用了一个名为count 的变量。 count 在使用重要代码之前的每次迭代中设置为 i。我必须这样做,因为 AL 是它自己的类并且无法访问 i。但是 count 是公共的和静态的,所以 AL 可以使用 count。

我的问题是所有按钮都打印 9。这在逻辑上是有道理的,因为发生的事情是每个按钮中的 AL 使用 count 变量,当循环完成时,count 将为 9,这意味着每个 AL 本质上将包含nums.setText(nums.getText()+ 9);。相反,我需要按钮 1 为 nums.setText(nums.getText()+ 1); 2 为 2,ETC。

我试过调用每个按钮的文本,但是因为需要在ArrayList的get方法中使用索引,所以需要一个变量,如果使用count也会出现同样的问题;在 for 循环终止后,计数为 9,因此所有按钮都打印 9 按钮的文本。

感谢任何和所有帮助,在此先感谢, -最大

附:以防你不明白我为什么要获取文本然后添加计数,这是因为为了输入数字 12。你需要输入 1,然后将 2 连接到 et 12。getText 得到1,加上 count 将 2 连接成 12。

【问题讨论】:

  • 为什么不将 count not 设为类的字段,而设为本地 final int 变量?例如,final int finalCount = i;

标签: java loops swing jbutton actionlistener


【解决方案1】:

一般来说,您会希望避免使用静态字段,因为这样会失去面向对象编程的所有好处。有特定的地方使用静态字段,但这不是其中之一。在您的情况下,您不能直接使用循环索引i,因为它不是最终局部变量,并且不能在匿名内部类中使用非最终局部变量。所以存在一个简单的解决方案:

将 count 设为最终局部变量,您应该可以在匿名内部类中使用它:

for(int i = 0; i <= 9; i++) {
    final int finalCount = i;
    btns.get(i).addActionListener(new ActionListener(){ 
        public void actionPerformed(ActionEvent e){ 

            nums.setText(nums.getText() + finalCount);

        }       
    });
}

【讨论】:

  • 作为 comm wiki 回答,因为我确信这是 许多 个问题的重复
【解决方案2】:

假设每个按钮的文本只是您希望附加的数字,还有另一种方法可以让您为每个数字按钮共享相同的 ActionListener 实例。

private ActionListener numberBtnListener = new ActionListener(){ 
    public void actionPerformed(ActionEvent e){ 
        JButton b = (JButton) e.getSource();
        nums.setText(nums.getText() + b.getText());
    }       
}

然后为每个按钮使用相同的监听器实例:

for(JButton b : btns) {
    b.addActionListener(numberBtnListener);
}

如果您的按钮文本由于某种原因而不同,您仍然可以使用相同的技术,方法是在每个按钮上使用客户端属性来保存您希望附加的值。例如:

 b.putClientProperty("digit", i);  

然后使用

nums.setText(nums.getText() + b.getClientProperty("digit"));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 2019-08-23
    相关资源
    最近更新 更多