我一直在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按钮互动?
答案 0 :(得分:2)
您可以执行错误消息告诉您的操作:使btn2成为最终的局部变量:
final JButton btn2 = new JButton("Click btn1!");
您的问题是您正在尝试操作内部类中的局部变量,除非将变量声明为final,否则不允许这样做。局部变量被复制然后传递到内部类中,如果它们不是最终的,那么局部变量可能会改变值(这里意味着它将引用另一个JButton),并且内部类的变量表示不会改变它。
另一种选择是将btn2声明为私有非静态类字段。
修改强>
正如@AaronDavidson在评论中所阐述的那样:
final意味着变量永远不会改变,这意味着匿名内部类保持对对象的引用是安全的,稍后当执行回调时,引用仍然有效。