2013-05-29 59 views
2

我做了计数计时器计数在java中定时器。我发现了下面的例子:Creating a Count Up timer to Break in java,这工作正常。但是我想表明在格式的时间“MM:SS:SSS”,因为我要测量非常小的时间响应。所以,当它达到1000毫秒时,它是1秒。Java创建(仅秒和毫秒)

我做了一些改变,但我不能出现时间都在假装格式。数字开始出现的时间应该是秒,而不是毫秒。

如果你有一个更好的例子是,我正在关注的一个,它的罚款。

编辑:这是更好,但它不工作的罚款呢。它计数太慢(这里1分钟对应2分钟)。我的代码在这里:

public class Counter extends JFrame { 

    private static final String stop = "Stop"; 
    private static final String start = "Start"; 
    private final ClockListener clock = new ClockListener(); 
    private final Timer timer = new Timer(1, clock); 
    private final JTextField tf = new JTextField(9); 

public Counter() 
{ 
    timer.setInitialDelay(0); 

    JPanel panel = new JPanel(); 
    tf.setHorizontalAlignment(JTextField.RIGHT); 
    tf.setEditable(false); 
    panel.add(tf); 
    final JToggleButton b = new JToggleButton(start); 
    b.addItemListener(new ItemListener() 
    { 
     @Override 
     public void itemStateChanged(ItemEvent e) 
     { 
      if (b.isSelected()) 
      { 
       timer.start(); 
       b.setText(stop); 
      } 
      else 
      { 
       timer.stop(); 
       b.setText(start); 
      } 
     } 
    }); 
    panel.add(b); 

    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    this.add(panel); 
    this.setTitle("Timer"); 
    this.pack(); 
    this.setLocationRelativeTo(null); 
    this.setVisible(true); 
} 

private class ClockListener implements ActionListener 
{ 
    private int minutes; 
    private int seconds; 
    private int milliseconds; 

    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     SimpleDateFormat date = new SimpleDateFormat("mm.ss.SSS"); 

     if (milliseconds == 1000) 
     { 
      milliseconds = 000; 
      seconds++; 
     } 
     if (seconds == 60) { 
      seconds = 00; 
      minutes++; 
     } 

     tf.setText(String.valueOf(minutes + ":" + seconds + ":" + milliseconds)); 
     milliseconds++; 
    } 
} 

public static void main(String[] args) 
{ 
    EventQueue.invokeLater(new Runnable() 
    { 
     @Override 
     public void run() { 
      Counter clock = new Counter(); 
      clock.start(); 
     } 
    }); 
    } 
} 
+0

毫秒为S不是M – user902383

+0

呀,你”再右吧。 – user2144555

回答

3

您正在计数并依靠计时器在1毫秒内过期。计时器(实际上是操作系统)并不能保证在到期之前只有1毫秒的时间会发生,并且你在到期时运行的代码也需要一些时间。相反,使用计时器只是为了触发刷新。我选择了53ms,因为它给用户一种模糊的感觉,毫秒是飞过的,但是注意到在用户点击停止之后最后一次定时器更新1,这不必是53ms的倍数。这被显示的是不相关的定时器到期数,只有当用户按下启动和当前系统时间的录制开始时间的时间:

public class Counter extends JFrame { 

    private static final String stop = "Stop"; 
    private static final String start = "Start"; 
    private final ClockListener clock = new ClockListener(); 
    private final Timer timer = new Timer(53, clock); 
    private final JTextField tf = new JTextField(9); 
    private final SimpleDateFormat date = new SimpleDateFormat("mm.ss.SSS"); 
    private long startTime; 

    public Counter() { 
     timer.setInitialDelay(0); 

     JPanel panel = new JPanel(); 
     tf.setHorizontalAlignment(JTextField.RIGHT); 
     tf.setEditable(false); 
     panel.add(tf); 
     final JToggleButton b = new JToggleButton(start); 
     b.addItemListener(new ItemListener() { 
      @Override 
      public void itemStateChanged(ItemEvent e) { 
       if (b.isSelected()) { 
        startTime = System.currentTimeMillis(); 
        timer.start(); 
        b.setText(stop); 
       } 
       else { 
        updateClock(); 
        startTime = 0; 

        timer.stop(); 
        b.setText(start); 
       } 
      } 
     }); 
     panel.add(b); 

     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.add(panel); 
     this.setTitle("Timer"); 
     this.pack(); 
     this.setLocationRelativeTo(null); 
     this.setVisible(true); 
    } 
    private void updateClock() { 
     Date elapsed = new Date(System.currentTimeMillis() - startTime); 
     tf.setText(date.format(elapsed)); 
    } 
    private class ClockListener implements ActionListener { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      updateClock(); 
     } 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       Counter clock = new Counter(); 
      } 
     }); 
    } 
} 
+0

请参阅此[相关方法](http://stackoverflow.com/a/2705674/230513)稍长的一段时间。 – trashgod