2010-11-30 50 views
0

降低至零我有一個毫秒,我將它轉換爲hh:mm:ss的現在我想讓它自動降低值加班..像倒計時JAVA製作時間擺動計時器

例如,當用戶看到它,2:11 0 - > 2:10 59 - > 58 2:10 ...

下面是我的代碼..

 Timer t = new Timer(1000, new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 

       int s = ((TIMER/1000) % 60); 
       int m = (((TIMER/1000)/60) % 60); 
       int h = ((((TIMER/1000)/60) /60) % 60); 

       timing.setText(hour + " hours, " + min + " minutes" + sec + " seconds"); 
       timing.repaint(); 
} 
} 
t.start(); 

這可能嗎?

回答

1
final Timer t = new Timer(1000, new ActionListener() { 
    private long time = 10 * 1000; //10 seconds, for example 

    public void actionPerformed(ActionEvent e) { 
     if (time >= 0) { 
      long s = ((time/1000) % 60); 
      long m = (((time/1000)/60) % 60); 
      long h = ((((time/1000)/60)/60) % 60); 
      timing.setText(h + " hours, " + m + " minutes " + s + " seconds"); 
      time -= 1000; 
     } 
    } 
}); 
t.start(); 
0

TIMER值永遠不會被定時器事件遞減。因此,每1000毫秒總是顯示相同的時間。

編輯:假設「計時」是一個Swing組件,重繪調用應該是不必要的。

+0

我該怎麼做?我是新來的java – SOer 2010-11-30 14:37:13

+0

假設TIMER是一個數字類型,TIMER - = 1000;應該這樣做。 http://download.oracle.com/javase/tutorial/java/nutsandbolts/op1.html下面是Java的各種定時器的更多參考資料:http://java.sun.com/products/jfc/tsc/articles/timer /和http://download.oracle.com/javase/tutorial/uiswing/misc/timer.html – Tansir1 2010-11-30 14:44:33

0

一個更安全的選擇是採取實際的時鐘時間。原因是你的應用程序可能會停下來等待時間。特別是如果你機器很忙。這意味着可能不會像您期望的那樣經常調用倒數計時器。如果使用System.currentTimeMillis(),無論發生什麼情況,時間總是正確的。

1

正如彼得在他的回答中提到,你不應該接力減少了許多,因爲有沒有保證actionPerformed是正確的,每秒調用。以下是一個工作示例,它可以在完成時停止定時器(詳細和代碼代碼):

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class Test extends JFrame { 
    private JTextField text; 
    private Timer timer; 
    private JButton start; 

    public Test() { 
    super("Countdown timer"); 
    text = new JTextField("2", 8); 
    start = new JButton("Start"); 
    start.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent click) { 
     final long current = System.currentTimeMillis(); 
     try { 
      final long limit = Integer.parseInt(text.getText().trim())* 1000; // X seconds 
      timer = new Timer(1000, new ActionListener() { 
      public void actionPerformed(ActionEvent event) { 
       long time = System.currentTimeMillis(); 
       long passed = time - current; 
       long remaining = limit - passed; 
       if(remaining <= 0) { 
       text.setText("2"); 
       timer.stop(); 
       } else { 
       long seconds = remaining/1000; 
       long minutes = seconds/60; 
       long hours = minutes/60; 
       text.setText(String.format("%02d:%02d:%02d", hours, minutes, seconds%60)); 
       } 
      } 
      }); 
      timer.start(); 
     } catch(NumberFormatException nfe) { 
      // debug/report here 
      nfe.printStackTrace(); 
     } 
     }}); 
    JPanel panel = new JPanel(); 
    panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); 
    panel.add(text); 
    panel.add(new JLabel(" seconds")); 
    panel.add(start); 
    add(panel); 
    } 

    public static void main(String [] args) throws Exception { 
    Test frame = new Test(); 
    frame.setDefaultCloseOperation(Test.EXIT_ON_CLOSE); 
    frame.pack(); 
    frame.setVisible(true); 
    } 
}