2010-11-30 58 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); 
    } 
}