Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在操作侦听器中更改Java窗口对象的属性_Java_Eclipse_Swing_Windowbuilder - Fatal编程技术网

在操作侦听器中更改Java窗口对象的属性

在操作侦听器中更改Java窗口对象的属性,java,eclipse,swing,windowbuilder,Java,Eclipse,Swing,Windowbuilder,我一直在Eclipse中使用WindowBuilder,并向按钮(btn1)添加了一个操作侦听器 我想将另一个按钮(btn2)的“Enabled”属性设置为true 我目前拥有的代码是: JButton btn1 = new JButton("Enable btn2"); btn1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) {

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


我已经算出了答案-让它成为最终答案-但我需要一个解释。什么是
final
允许的?是否有理由认为它必须是最终的?我不太愿意遵循快速修复建议,因为我不明白它的意思。final意味着变量永远不会更改,这意味着匿名内部类保留对对象的引用是安全的,稍后执行回调时,引用仍然有效。@AaronDavidson:我自己说得再好不过了。谢谢我希望你不介意我借用了你的评论,并把它放在了我的答案中。