Java Swing.Timer получит миллисекунду в реальном времени
У меня проблема в моей программе. Я хочу получить миллисекунду в реальном времени, равную 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());
}
}
}
Есть ли другой способ получить миллисекунду, вместо того, чтобы объявлять целое число и увеличивать его?
1 ответ
Решение
- Вы хотите избавиться от этого
while (true)
и вместо этого используйте таймер Swing вместо него, поскольку именно для этого и нужен таймер - многократные вызовы в графическом интерфейсе Swing, не прибегая к прерыванию потокаwhile (true)
построить. - Вы захотите дать вашему таймеру разумную задержку. 0? Здравый смысл говорит вам не использовать это. 12, 15 - лучше.
- Чтобы таймер 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 означает длинное целое число, поэтому вы можете думать, что оно похоже на int, но может переносить гораздо большие положительные и отрицательные значения без переполнения.