我正在尝试制作一个秒表,它可以不断更新屏幕上的时间。 time 对象是一个应显示耗时的 JLabel。我已经导入并设置了所有内容,但每当单击开始按钮激活计时器时,程序就会卡住。
public class Timing
{
public void Timer()
{
startTime = System.currentTimeMillis();
while(isTiming == true)
{
endTime = System.currentTimeMillis();
elapsedTime = endTime - startTime;
time.setText("" + elapsedTime);
info.validate();
}
endTime = System.currentTimeMillis();
elapsedTime = endTime - startTime;
time.setText("" + elapsedTime);
info.validate();
}
}
这是 Action 监听器部分:
public void actionPerformed(ActionEvent arg0)
{
if(((JButton) arg0.getSource()).getText().equals("Start"))
{
isTiming = true;
new Timing().Timer();
}
最佳答案
您正在尝试在 UI 线程的循环中同步更新标签,该线程与应用 UI 更新的线程相同。通过这样做,您将阻止执行,从而导致您所描述的卡住。
要解决此问题,您可以使用 javax.swing.Timer
安排更新,以便它们在同一 UI 线程中运行,但仅在需要时运行,即
timer = new javax.swing.Timer(10, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
...
time.setText("" + elapsedTime);;
}
});
...
public void actionPerformed(ActionEvent arg0)
{
if(((JButton) arg0.getSource()).getText().equals("Start"))
{
isTiming = true;
timer.start();
}
}
关于java - Java中的实时更新秒表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20830834/