在Java中实时更新秒表?
我正在尝试制作一个秒表,它能不断更新屏幕上的时间。time对象是一个JLabel,应该显示经过的时间。我已经导入了所有内容并进行了正确的设置,但只要单击开始按钮激活计时器,程序就会冻结在Java中实时更新秒表?,java,eclipse,multithreading,swing,Java,Eclipse,Multithreading,Swing,我正在尝试制作一个秒表,它能不断更新屏幕上的时间。time对象是一个JLabel,应该显示经过的时间。我已经导入了所有内容并进行了正确的设置,但只要单击开始按钮激活计时器,程序就会冻结 public class Timing { public void Timer() { startTime = System.currentTimeMillis(); while(isTiming == true) { end
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();
}
您正尝试在UI线程中的循环中同步更新标签,该线程与应用UI更新时使用的线程相同。通过这样做,您将阻止执行,从而导致您所描述的冻结 要解决这个问题,您可以使用调度更新,以便它们将在同一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();
}
}
在哪里添加计时器?我试着把它添加到我的声明中,但它抛出了100个错误。您可以将其添加为一个类的字段。如果你在这方面有困难,你可能想看看