Java Swing.Timer получит миллисекунду в реальном времени

1

У меня проблема в моей программе. Я хочу получить миллисекунду в реальном времени, равную 1000 за 1 секунду. Вот мой код:

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

Есть ли другой способ получить миллисекунду, а не объявлять целое число и увеличивать его?

  • 2
    Если я вас правильно понял, вы хотите, чтобы метод actionPerformed вызывался 1000 раз в секунду, а именно каждую миллисекунду. Это вряд ли будет возможно. Вы можете приблизиться к этому с собственным потоком и занятым ожиданием , но даже тогда это будет трудно. («Оживленное ожидание» здесь действительно относится к неуправляемому циклу while(true) - это самое близкое к «реальному времени», которое вы можете получить в Java, но вам вряд ли когда-нибудь придется это делать ...)
Теги:
swing

1 ответ

3
Лучший ответ
  1. Вы захотите избавиться от этого while (true) и вместо этого использовать таймер Swing на своем месте, поскольку это то, за что Таймер предназначен для - неоднократного совершения вызовов в графическом интерфейсе Swing без необходимости прибегать к разрыву потока while (true).
  2. Вы захотите дать вашему таймеру разумное время задержки. 0? Здравый смысл подсказывает вам не использовать это. 12, 15 - лучше.
  3. Для работы таймера Swing необходимо иметь активный поток событий Swing, и это можно получить, показывая графический интерфейс Swing, любой графический интерфейс, такой как 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 long long integer, и поэтому вы можете думать, что он похож на int, но способен терпеть гораздо большие положительные и отрицательные значения без переполнения.

  • 0
    благодарю вас! это так полезно, я проанализирую код позже :)
  • 0
    какая польза от difftime? и я не могу понять расчет долго. Могу ли я попросить ссылку на длинный тип данных? это очень ново для меня
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню