java - 带有 lambda 表达式的 ActionListener 实现不能由 Timer 调用

标签 java lambda

我正在阅读 [Core Java Vol 1] 第 10 版这本书,在第 6 章第 6.3.6 节中有一个代码片段用于解释 lambda 表达式中的“变量作用域”。我自己运行了这段代码,它刚刚终止立即并且不会像控制台日志中预期的那样每 2 秒显示一次“Hello”。

我正在使用 jdk1.8.0_202,这是我的代码:

package variableScope;

import java.awt.Toolkit;
import java.awt.event.ActionListener;

import javax.swing.Timer;

public class VariableScopeTest {
    public static void main(String[] args) {
        repeatMessage("Hello", 2000);
    }

    private static void repeatMessage(String text, int delay) {
        ActionListener listener = event -> {
            System.out.println(text);
            Toolkit.getDefaultToolkit().beep();
        };
        new Timer(delay, listener).start();
    }
}

任何解释为什么这不起作用?谢谢!

最佳答案

这与 lambda 完全无关,与没有 Swing 事件线程有关。您需要显示一个 Swing GUI 以便事件线程运行;像 JOptionPane 这样简单的东西就可以了。单独使用计时器是不行的。

例如,

import java.awt.Toolkit;
import java.awt.event.ActionListener;    
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class Foo {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            repeatMessage("Hello", 2000);
            JOptionPane.showMessageDialog(null, "foo"); // starts the thread
        });

    }

    private static void repeatMessage(String text, int delay) {
        ActionListener listener = event -> {
            System.out.println(text);
            Toolkit.getDefaultToolkit().beep();
        };
        new Timer(delay, listener).start();
    }
}

关于java - 带有 lambda 表达式的 ActionListener 实现不能由 Timer 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55556091/

相关文章:

java - 设置java_home奇怪的错误

java - OutputStream 对象(作为方法调用中的表达式创建,但未分配给变量)是否仍应关闭?

java - 在 Java 中设置图标图像

C#如何将两个表达式组合成一个新的?

c# - GC 何时可以收集挂接到事件的 Lambda?

java - Fab 图标大小更改

java - 存储两个同名变量的对象

C# Linq 或 Lambda 表达式 Group by Week IEnumerable list with date field

python - 想要在spark python中将字符串值转换为 float

java - 使用 Stream 读取文件并跟踪当前索引