JAVA通过摆动计时器将时间减少到零

时间:2010-11-30 14:24:00

标签: java swing

我有一毫秒我转换它hh:mm:ss现在我想让它自动减少超时值..像倒数计时器

例如,当用户看到它时,2:11 0 - > 2:10 59 - > 2:10 58 ......

以下是我的代码..

        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();

有可能吗?

4 个答案:

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

答案 1 :(得分: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);
  }
}

答案 2 :(得分:0)

TIMER值永远不会被timer事件递减。因此,每1000毫秒始终会显示相同的时间。

编辑:假设“计时”是一个Swing组件,则不需要重新调用。

答案 3 :(得分:0)

更安全的选择是采用实际的时钟时间。这样做的原因是你的应用程序可以停止使用pewriods。 esp如果您的机器很忙。这意味着倒数计时器可能不会像您期望的那样经常被调用。如果使用System.currentTimeMillis(),无论发生什么情况,时间总是正确的。