我一直在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表示该变量永远不会更改,这意味着匿名内部类保留对该对象的引用是安全的,并且稍后在执行回调时,该引用仍然有效。