java - Java中的实时更新秒表?

标签 java eclipse multithreading swing

我正在尝试制作一个秒表,它可以不断更新屏幕上的时间。 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/

相关文章:

java - 围绕变量而不是类或方法进行同步

java - 当我滚动 ListView 时, TextView 的默认值是 0

c++ - 使用 CDT for C++ 在 Eclipse 中重命名类的更舒适方式?

java - 在 Eclipse 中创建共享公共(public)库的 Android 应用程序

python - 线程在Python中真的很重要吗?

c++ - `scoped_thread` 通过值 `std::thread`

java - 在什么情况下将调用 Java Agent premain 方法?

java - 如何让记录器包裹在 slf4j 中?

java - Android 存储值

android - 亚行错误 : unable to parse adb version