Java Swing.Timer获得实时毫秒

时间:2014-08-31 13:58:29

标签: java swing javax.swing.timer

我的程序出现问题。我希望得到一个实时毫秒,在1秒内等于1000。这是我的代码:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Timer;

class lsen implements ActionListener{
    int ms = 0;
    int s = 0;
    int m = 0;

    public void actionPerformed(ActionEvent e){
        this.ms++;

        if(this.ms == 500){
            this.s++;
            this.ms = 0;
        }
        if(this.s == 60){
            this.m++;
            this.s = 0;
        }
    }

    public int getMS(){
        return this.ms;
    }
    public int getSS(){
        return this.s;
    }
    public int getMM(){
        return this.m;
    }
}

public class stopwatch_main{
    public static void main(String[] args) {
        lsen l = new lsen();
        Timer t = new Timer(0,l);
        t. start();
        while(true){
            System.out.println(l.getMM()+":"+l.getSS()+":"+l.getMS());
        }
    }
}

有没有其他方法可以获得毫秒而不是声明一个整数并递增它?

1 个答案:

答案 0 :(得分:3)

  1. 你想要摆脱那个while (true),而不是使用Swing Timer,因为这就是Timer的用途 - 在Swing GUI中重复调用而不用不得不诉诸破解while (true)构造。
  2. 您需要给定时器一个合理的延迟时间。 0?常识告诉你不要使用它。 12,15 - 更好。
  3. 要使Swing Timer工作,您需要有一个活动的Swing事件线程,这可以通过显示Swing GUI,任何GUI(如JOptionPane)来获得。
  4. 例如:

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.Timer;
    
    class Lsen implements ActionListener {
       public static final int MSECS_PER_SEC = 1000;
       public static final int SECS_PER_MIN = 60;
       public static final int MIN_PER_HR = 60;
       private static final String TIME_FORMAT = "%02d:%02d:%02d:%03d";
    
       private long startTime;
       private JTextField timeField;
    
       public Lsen(JTextField timeField) {
          this.timeField = timeField;
       }
    
       public void actionPerformed(ActionEvent e) {
          if (startTime == 0L) {
             startTime = System.currentTimeMillis();
          } else {
             long currentTime = System.currentTimeMillis();
             int diffTime = (int) (currentTime - startTime);
    
             int mSecs = diffTime % MSECS_PER_SEC;
             diffTime /= MSECS_PER_SEC;
    
             int sec = diffTime % SECS_PER_MIN;
             diffTime /= SECS_PER_MIN;
    
             int min = diffTime % MIN_PER_HR;
             diffTime /= MIN_PER_HR;
    
             int hours = diffTime;
    
             String time = String.format(TIME_FORMAT, hours, min, sec, mSecs);
             // System.out.println("Time: " + time);
             timeField.setText(time);
          }
       }
    }
    
    public class StopWatchMain {
       private static final int TIMER_DELAY = 15;
    
       public static void main(String[] args) {
          final JTextField timeField = new JTextField(10);
          timeField.setEditable(false);
          timeField.setFocusable(false);
          JPanel panel = new JPanel();
          panel.add(new JLabel("Elapsed Time:"));
          panel.add(timeField);
    
          Lsen l = new Lsen(timeField);
          Timer t = new Timer(TIMER_DELAY, l);
          t.start();
          JOptionPane.showMessageDialog(null, panel);
          t.stop();
       }
    }
    

    修改
    您询问长数据类型的含义。请看这里:Primitive Data Types。你会发现long意味着长整数,所以你可以认为它与int类似但能够容忍更大的正负值而不会溢出。