2013-02-17 37 views
4

我想重複使用擺動計時器打印一個語句,但是語句沒有打印!擺動計時器不起動

我在做什麼錯誤?

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"); 
     }  
    } 
+1

滑稽如何[類似的問題(http://stackoverflow.com/q/14900697/203657)趨向在同一時間蠕動:-) – kleopatra 2013-02-17 13:20:01

回答

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 
    } 
} 
+0

我用java.util.Timer,它工作正常! 但我想問一下在非Gui應用程序中,我不能使用swing.Timer嗎? – Snehasish 2013-02-17 11:21:08

+0

GUI具有事件隊列和計時器事件在GUI事件隊列上發佈。 – Aubin 2013-02-17 12:16:59

2

javax.swing.Timer應該只使用Swing應用程序時使用。目前您的主要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

+0

我試過你的代碼,但打印隨機停止! 有時10秒後,有時4秒! – Snehasish 2013-02-17 11:18:48

+0

是的,你是對的! 我試過在timer.start()後調用Thread.sleep(50000),它工作! – Snehasish 2013-02-17 11:30:46

+0

我也在timer.start()之後試過這個,它也起作用了! long count = 0; for(long i = 0; i <1000000000; i ++) count ++; – Snehasish 2013-02-17 11:32:49