我正在尝试制作一个秒表,不断更新屏幕的时间。 时间对象是应显示已用时间的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();
}
}
这是动作侦听器部分:
public void actionPerformed(ActionEvent arg0)
{
if(((JButton) arg0.getSource()).getText().equals("Start"))
{
isTiming = true;
new Timing().Timer();
}
答案 0 :(得分:7)
您正尝试在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();
}
}