在动作侦听器中编辑变量不起作用

Edit variable in action listener not working

我还在学习Java,但我已经为此苦苦挣扎了很长时间。

我希望能够在按下按钮后编辑设置一个布尔值,但它永远行不通。

这是一个例子:

    JButton send = new JButton();
    Boolean click = false

    send.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                click = true
            }
        });
    if (click){
            System.out.println("WORKS GOOD!!")
    }

但是变量没有改变。

if (click) 条件仅被评估一次,在任何按钮点击发生之前,当时点击是 false。每次按下按钮后,您都需要重新评估条件。

布尔值的用途是什么?为什么不这样做:

JButton send = new JButton();

send.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            System.out.println("WORKS GOOD!!");
        }
    });

算了。在Java中没有办法做出你想做的事。在封闭对象内(即 new ActionListener()),您可以访问 final 来自封闭类型的变量,并且只读取它们,但永远不会改变,因为它们是 final.

下面的示例代码有效(但仅此而已):

    final Boolean click = false;    

    send.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                System.out.println("outside variable 'click' is:" + click);
            }
        });

顺便说一句:您尝试做的事情不是一个好主意并且 Java 不允许这样做,因为这不是一个好主意...:-)

更新:如果你仍然想这样做,你可以制作一个包装器 class。

下面的代码有效,但以后不要告诉我,我没有警告你这是一个非常糟糕的主意。

public class MyClass {

public static void main(String[] args) {
    JButton send = new JButton();
    final BooleanWrapper click = new BooleanWrapper();

    click.value = false;

    send.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                click.value = true;
            }
        });

    send.getActionListeners()[0].actionPerformed(new ActionEvent(new MyClass(), 1, "very bad idea"));

    if (click.value ){
            System.out.println("WORKS GOOD!!");
    }

}

private static class BooleanWrapper
{
    private Boolean value;
}

}