具有lambda表达式的ActionListener实现无法由Timer调用

时间:2019-04-07 06:04:02

标签: java lambda

我正在阅读[Core Java Vol 1]第10版,第6章第6.3.6节中有一个代码片段,用于解释lambda表达式中的“变量范围”。我自己运行了该代码,但该代码刚刚终止立即,并且不会每两秒在控制台日志中显示“ Hello”。

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

git reset --merge

有人解释为什么这行不通吗?谢谢!

1 个答案:

答案 0 :(得分:3)

这与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();
    }
}