我一直在Eclipse中使用WindowBuilder,并向按钮(btn1)添加了一个动作监听器。

我希望这将另一个按钮(btn2)的“ Enabled”属性设置为true。

我目前拥有的代码是:

JButton btn1 = new JButton("Enable btn2");
    btn1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            btn2.setEnabled(true);
        }
    });
    toolBar.add(btn1);

JButton btn2 = new JButton("Click btn1!");
    btn2.setEnabled(false);
    toolBar.add(btn2);


(上面的代码在名为toolBar的工具栏中)。

唯一的问题是,我想在btn1中运行actionPerformed()代码,但是它不允许我与btn2进行交互。我尝试将代码放在btn2的声明之后,但是仍然出现以下编译错误:

Cannot refer to a non-final variable btnStop inside an inner class defined in a different method


如何与btn2按钮互动?

最佳答案

您可以按照错误消息告诉您的方式进行操作:使btn2成为最终的局部变量:

final JButton btn2 = new JButton("Click btn1!");


您的问题是您正在尝试在内部类内部操作局部变量,除非将变量声明为final,否则这是不允许的。复制局部变量,然后将其传递给内部类,如果它们不是最终的,则局部变量可能会更改值(此处意味着它将引用另一个JButton),而内部类对变量的表示将不会改变它。

另一种选择是将btn2声明为私有非静态类字段。



编辑
正如@AaronDavidson在评论中所说的那样:


  final表示该变量永远不会更改,这意味着匿名内部类保留对该对象的引用是安全的,并且稍后在执行回调时,该引用仍然有效。

10-01 22:07