2016-07-02 13 views
1

次のプログラムは、1秒ごとに日付を出力すると仮定しています。しかし、これは既知の理由では機能しません。actionListenerインターフェイスactionPerformedメソッドがTimerクラスで動作しない

import java.awt.event.ActionListener; 
import javax.swing.Timer; 


public class CurrentTimePrinterTester { 

    public static void main(String[] args) { 
     ActionListener listener = new CurrentTimePrinter(); 

     Timer t = new Timer(1000, listener); 
     t.start(); 
    } 
} 
+2

Swing GUIを作成する必要があります。または、Swingイベントディスパッチスレッドを実行し続ける必要があります。 –

答えて

2

あなたはnon-daemon threadにあなたのコードを実行する必要があります。

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Date; 

public class CurrentTimePrinter implements ActionListener{ 

     public void actionPerformed(ActionEvent e){ 
     System.out.println(new Date()); 

    } 
} 

これはテスタークラスがある:

私は、次のクラスでActionListenerインタフェースとactionPerformedメソッドを実装しています。現在のところ、Timerがデーモンスレッドとして起動しますが、mainがJVMを終了するために発生します。

あなたはこのように(非デーモンです)EDTからタイマーを起動することができます。

public static void main(String[] args) { 

    ActionListener listener = new CurrentTimePrinter(); 
    SwingUtilities.invokeLater(() -> new Timer(1000, listener).start()); 
} 

、これは生きているJVMを保持します。

スレッド上のいくつかの余分ノート:

swing.TimerはGUIをで使用するためにカスタマイズされた単純化されたクラスです。これにより、柔軟性が低下するという欠点が生じる。このようなタイマーがすべて実行されるスレッドはバックグラウンドで設定され、デーモンです。

util.Timerにはデフォルトで非デーモンスレッドがあり、柔軟性はcreated otherwiseです。各タイマーには独自のスレッドがあります。

関連する問題