如何从 Java AWT actionListener 为局部变量赋值

How to assign value to local variable from Java AWT actionListener

我想制作一个字符串 return 类型的方法,当按下按钮时它将 return 特定值,我想出了下面的代码,不幸的是它不起作用。谁能建议如何修复我的代码,或者是否有更好的方法来获得我想要的东西?我已将 Button b 定义为 Class 变量。我在代码中添加了一个错误,作为注释。

public String sample() {

    String retString = null;
    
    b.addActionListener(new ActionListener() {
        
        @Override
        public void actionPerformed(ActionEvent e) {
            retString = "return String";
            //Local variable retString defined in an enclosing scope must be final or effectively final
            
        }
    });
    
    return retString;
}

您的功能将不起作用,因为 .addActionListener 不会等到有人按下按钮。假设您在添加 ActionListener 时告诉 java “嘿,当我按下这个按钮时,您能把它写在一张纸上吗?”。一旦按下一个按钮,这张纸就不会是空的。这称为添加回调。 那你怎么能绕过它呢? 最简单的方法(虽然不是最好的)就是等到那张纸不为空。在这种情况下,它是您的字符串,因为只有当按下按钮时,只有当您的函数被调用时,只有当您的函数更改 retString 时,retString 才不为空。

while (retString == null) {}
System.out.println(retString);

为什么这样不好?执行此操作时,您将停止在执行 while 循环的线程上执行代码,直到您按下按钮。

更好的解决方案

在回调中实现你正在做的事情,例如

button.addActionListener(e -> {
    System.out.println("Button pressed!");
});

您不需要在 .addActionListener() 中创建回调。事实上,您可以制作一个实现 ActionListener 的 class,允许在不同组件之间使用相同的回调功能。例如

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class CustomCallback implements ActionListener {
    int amountOfTimesCalled = 0;
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Callback called by " + e.getSource());
        amountOfTimesCalled++;
        if (amountOfTimesCalled > 5) {
            System.exit(0);
        }
    }
}

你可以在多个按钮上使用它,例如

final CustomCallback callback = new CustomCallback();
button1.addActionListener(callback);
button2.addActionListener(callback);