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 保持活动状态,您的 main 结束,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.Timer仅应在使用 Swing 应用程序时使用。目前您的 mainThread正在退出,因为Timer使用了 daemon Thread。作为一种解决方法,您可以这样做:

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 回答