更改动作侦听器内的Java窗口对象的属性

时间:2014-04-13 17:11:28

标签: java eclipse swing windowbuilder

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

我想要设置"启用"另一个按钮(btn2)的属性为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按钮互动?

1 个答案:

答案 0 :(得分:2)

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

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

您的问题是您正在尝试操作内部类中的局部变量,除非将变量声明为final,否则不允许这样做。局部变量被复制然后传递到内部类中,如果它们不是最终的,那么局部变量可能会改变值(这里意味着它将引用另一个JButton),并且内部类的变量表示不会改变它。

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


修改
正如@AaronDavidson在评论中所阐述的那样:

  

final意味着变量永远不会改变,这意味着匿名内部类保持对对象的引用是安全的,稍后当执行回调时,引用仍然有效。