我正在阅读 [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/