【问题标题】:JAVA making time to decrease to zero by swing timerJAVA通过摆动定时器使时间减少到零
【发布时间】:2010-11-30 14:23:59
【问题描述】:

我有一毫秒,我将它转换为 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();

有可能吗?

【问题讨论】:

    标签: java swing


    【解决方案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();
    

    【讨论】:

      【解决方案2】:

      正如彼得在他的回答中提到的那样,您不应该继续减少数字,因为不能保证每秒都会正确调用 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);
        }
      }
      

      【讨论】:

        【解决方案3】:

        TIMER 值永远不会因定时器事件而递减。因此,将始终每 1000 毫秒显示一次。

        编辑:假设“timing”是一个 Swing 组件,应该不需要调用 repaint。

        【讨论】:

        【解决方案4】:

        更安全的选择是采用实际时钟时间。这样做的原因是您的应用程序可能会停止一段时间。特别是如果你的机器很忙。这意味着倒数计时器可能不会像您预期的那样频繁调用。如果你使用 System.currentTimeMillis() ,无论发生什么,时间总是正确的。

        【讨论】:

          猜你喜欢
          • 2019-12-10
          • 1970-01-01
          • 2013-10-13
          • 1970-01-01
          • 1970-01-01
          • 2021-01-16
          • 1970-01-01
          • 2023-03-08
          • 1970-01-01
          相关资源
          最近更新 更多