如何从 Java AWT actionListener 为局部变量赋值
Posted
技术标签:
【中文标题】如何从 Java AWT actionListener 为局部变量赋值【英文标题】:How to assign value to local variable from Java AWT actionListener 【发布时间】:2021-07-08 22:33:48 【问题描述】:我想做一个字符串返回类型的方法,当按钮被按下时,它会返回特定的值,我想出了下面的代码,不幸的是它不起作用。任何人都可以建议如何修复我的代码,或者是否有更好的方法来获得我想要的东西?我已将 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;
【问题讨论】:
你希望这个方法在按下按钮之前什么都不做吗? 我在特定时间调用该方法,将其返回值赋给其他变量 几点了?在操作已经执行之后,还是什么? 【参考方案1】:您的函数将不起作用,因为 .addActionListener 不会等到有人按下按钮。想象一下,当您添加 ActionListener 时,您正在告诉 java “嘿,当我按下此按钮时,您能把它写在一张纸上吗?”。一旦按下按钮,只有这样,这张纸才不会是空的。这称为添加回调。 那么你怎么能绕过它呢? 最简单的方法(尽管不是最好的)就是等到那张纸不为空。在这种情况下它是你的字符串,因为只有当一个按钮被按下时,只有当你的函数被调用时,只有当你的函数改变 retString 时,只有这样 retString 才不是空的。
while (retString == null)
System.out.println(retString);
为什么这不好?执行此操作时,您将停止在执行 while 循环的线程上执行代码,直到您按下按钮。
更好的解决方案
在回调中实现你正在做的事情,例如。
button.addActionListener(e ->
System.out.println("Button pressed!");
);
您不需要在 .addActionListener() 中创建回调。事实上,您可以创建一个实现 ActionListener 的类,允许跨不同组件使用相同的回调功能。例如
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);
【讨论】:
谢谢,我得到了我什至不知道我感兴趣的信息。这不是我想要的,但它对我帮助很大。以上是关于如何从 Java AWT actionListener 为局部变量赋值的主要内容,如果未能解决你的问题,请参考以下文章
Java AWT 图形界面编程LayoutManager 布局管理器 ⑤ ( CardLayout 卡片布局 | ActionListener 按钮点击事件添加 )
Java AWT 图形界面编程LayoutManager 布局管理器 ⑤ ( CardLayout 卡片布局 | ActionListener 按钮点击事件添加 )
无效的线程访问:AWT ActionListener 中的 SWT