Swing计时器不启动

时间:2013-02-17 11:00:36

标签: java swing

我正在尝试使用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");
        }    
    }

2 个答案:

答案 0 :(得分: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
   }
}

答案 1 :(得分:2)

只有在使用Swing应用程序时才应使用

javax.swing.Timer。目前,您的主Thread正在退出,因为Timer使用了守护程序Thread。作为一种解决方法,您可以这样做:

public static void main(String[] args) {

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

非UI应用程序的替代方法是使用ScheduledExecutorService