4

Swing Timer を使用してステートメントを繰り返し印刷しようとしていますが、ステートメントが印刷されません。

私が犯している間違いは何ですか?

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

    public class SwingTimer implements ActionListener {

        Timer timer;

        public static void main(String[] args) {
            SwingTimer obj = new SwingTimer();
            obj.create();
        }

        public void create() {
            timer = new Timer(1000, this);
            timer.setInitialDelay(0);
            timer.start();
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("Hello using Timer");
        }    
    }
4

2 に答える 2

2

javax.swing.Timer はおそらくデーモン スレッドとして開始します。jvm を維持せず、メインが終了し、jvm が終了します。最初のダイアログまたはフレームが表示されると開始する GUI イベント キューにタイマー イベントをポストします。

ウィンドウ システムがまったく必要ない場合は、JFrame を作成して表示するか、java.util.Timerを使用する必要があります。

次のコードは、 の使用方法を示していますjava.util.Timer

import java.util.Timer;
import java.util.TimerTask;

public class TimerDemo extends TimerTask {

   private long time = System.currentTimeMillis();

   @Override public void run() {
      long elapsed = System.currentTimeMillis() - time;
      System.err.println( elapsed );
      time = System.currentTimeMillis();
   }

   public static void main( String[] args ) throws Exception {
      Timer t = new Timer( "My 100 ms Timer", true );
      t.schedule( new TimerDemo(), 0, 100 );
      Thread.sleep( 1000 );              // wait 1 seconde before terminating
   }
}
于 2013-02-17T11:07:48.753 に答える
2

javax.swing.TimerSwing アプリケーションを使用する場合にのみ使用してください。現在、デーモンを使用しているため、メインThreadは終了しています。回避策として、次のことができます。TimerThread

public static void main(String[] args) {

   SwingTimer obj = new SwingTimer();
   obj.create();
   JOptionPane.showMessageDialog(null, "Timer Running - Click OK to end");
}

非 UI アプリケーションの代替手段は、ScheduledExecutorServiceを使用することです。

于 2013-02-17T11:09:19.067 に答える