- 您将希望摆脱它
while (true)
,而是使用 Swing Timer 代替它,因为这就是 Timer 的用途——在 Swing GUI 中重复调用,而不必求助于线程中断while (true)
构造。
- 你会想要给你的定时器一个合理的延迟时间。0? 常识告诉你不要使用它。12、15——更好。
- 要使 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 但能够容忍更大的正值和负值而不会溢出。