当前位置: 首页 > 面试题库 >

Java Swing.Timer获得实时毫秒

公孙智
2023-03-14
问题内容

我的程序有问题。我想在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. 您将希望摆脱它while (true),而使用Swing计时器代替它,因为那是Timer的用途-在Swing GUI中重复进行调用, 不必求助于破坏线程的while (true)构造。
  2. 您将需要给您的计时器一个合理的延迟时间。0?常识告诉您不要使用此功能。12、15-更好。
  3. 为了使Swing计时器正常工作,您需要有一个活动的Swing事件线程,这可以通过显示Swing GUI,任何GUI(例如JOptionPane)来获得。

例如:

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

编辑
您询问长数据类型的含义。请在此处查看:原始数据类型。您会看到long表示长整数,因此您可以认为它与int相似,但是能够容忍更大的正值和负值而不会溢出。



 类似资料: