在Java中,如何从ActionListener内部更改变量的值?

在Java中,如何从ActionListener内部更改变量的值?,java,Java,如何使用此操作侦听器将test更改为1我知道上面的代码不起作用,但我能做些什么?除非变量是最终变量,否则无法访问该变量,因为这是Java管理闭包的方式 int test; b.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent b){ test = 1; } }); 恐怕你不能这么做 假设test是一个局部变量,则不允许回调方法更改它 为什么?

如何使用此操作侦听器将test更改为1我知道上面的代码不起作用,但我能做些什么?

除非变量是最终变量,否则无法访问该变量,因为这是Java管理闭包的方式

    int test;

b.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent b){
        test = 1;
    }
});

恐怕你不能这么做

假设test是一个局部变量,则不允许回调方法更改它

为什么?

因为在调用回调时,声明测试变量的方法可能已经返回,这意味着该变量不再存在。编译器抱怨在侦听器方法中测试应该是只读的。。。我想

让我们把它放在一个假设的上下文中:

private final MyClass test = new MyClass();

b.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent b){
        test.setMyInt(1);
    }
});

public class MyClass{
    int myInt;
    // getter/setter
}
这里的目的是在单击按钮时打印test is 1

但这行不通。问题是addActionListener添加了listener方法并立即返回。接下来发生的事情是myMethod将尝试打印测试。即使这是合法的Java,也不是!打印的值将为0。。。不是1

我们可以通过将test声明为实例变量而不是局部变量来修复编译错误

public class MyClass {
    Button b = ...

    public void myMethod() {
        int test = 0;

        b.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent b){
                test = 1;   // COMPILATION ERROR
            }
        });

        System.out.println("test is " + test);
    }
}
但代码仍然不能满足我们的要求。测试变量将很快打印出来

您需要了解的是,回调总是在稍后发生。如果您想在println点看到对测试的更改,那么回调侦听器不是实现这些事情的正确方法


摘要:示例代码中既有编译错误,也有概念问题。

好的,我刚刚意识到动作侦听器中有void,这很有意义。返回类型与变量可见性有什么关系?这就是你想要的吗?它可以只是一个局部变量。或者直接将myInt作为封闭类的一个字段。我的目的不是打印它,只是为了以后存储它,所以如果在单击按钮时更改它,那么它就工作了,因为我唯一会使用它的时间是在单击另一个按钮时,所以实例变量应该工作。然后,您的错误是将它存储在本地变量中变量因为局部变量以后就不会出现了。是的,我意识到把它改成一个实例变量对我所做的工作非常有效,谢谢。
public class MyClass {
    Button b = ...
    int test = 0;

    public void myMethod() {

        b.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent b){
                test = 1;   // OK now ...
            }
        });

        System.out.println("test is " + test);
    }
}