如何从 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

如何使用Java找到偏差

java中如何从一个窗口通过点击按钮进入另外一个窗口? (两个窗口不在一个class中。)

java中如何做到界面的跳转?