簡體   English   中英

具有lambda表達式的ActionListener實現不適用於Timer調用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM