用Java实时更新秒表?

时间:2013-12-29 22:31:44

标签: java eclipse multithreading swing

我正在尝试制作一个秒表,不断更新屏幕的时间。 时间对象是应显示已用时间的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();
    }

1 个答案:

答案 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();
    }
}