在Java中实时更新秒表?

在Java中实时更新秒表?,java,eclipse,multithreading,swing,Java,Eclipse,Multithreading,Swing,我正在尝试制作一个秒表,它能不断更新屏幕上的时间。time对象是一个JLabel,应该显示经过的时间。我已经导入了所有内容并进行了正确的设置,但只要单击开始按钮激活计时器,程序就会冻结 public class Timing { public void Timer() { startTime = System.currentTimeMillis(); while(isTiming == true) { end

我正在尝试制作一个秒表,它能不断更新屏幕上的时间。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();
    }
}
以下是动作监听器部分:

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个错误。您可以将其添加为一个类的字段。如果你在这方面有困难,你可能想看看