如何从 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);
我想制作一个字符串 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);