代码之家  ›  专栏  ›  技术社区  ›  Maximus

JButton ActionListeners在每个循环中使用不同的变量

  •  1
  • Maximus  · 技术社区  · 6 年前

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

    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 计数 设置为 i 在使用重要代码之前的每次迭代中。我必须这样做,因为AL是它自己的类,不能访问I。但是count是公共的和静态的,因此ALs可以使用count。

    nums.setText(nums.getText()+ 9); . 相反,我需要一个按钮 nums.setText(nums.getText()+ 1); 2比2等。

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

    感谢所有帮助,提前感谢, -马克斯

    顺便说一句,如果你不明白为什么我要得到文本,然后加上计数,那是因为为了键入数字12。你需要键入1,然后将2连接到et 12。getText得到1,然后加上计数将2连接到et 12。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Hovercraft Full Of Eels    6 年前

    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);
    
            }       
        });
    }
    
        2
  •  0
  •   swpalmer    6 年前

    假设每个按钮的文本只是您希望附加的数字,那么还有另一种方法可以让您为每个数字按钮共享相同的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"));