[英]ActionListener implementation with lambda expression doesn't work invoked by a Timer
我正在閱讀[核心Java第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();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.