Java Swing:Event-Dispatching Thread VS秒表

时间:2011-03-19 19:52:01

标签: java swing

我有一个基于Swing的GUI程序。在主类中有一些计算在一个单独的线程中分组。我的问题是:当这些计算开始时,我需要启动一个秒表,在他们完成时显示计时器,在完成时停止。 如果我只需要计算剩余的时间,我会在单独的线程中启动秒表,在主线程中进行所有计算,并在完成时停止秒表线程并显示计时器。 据我所知,java swing是单线程的。这样我就可以在主摆动中重新绘制秒表的数字了

4 个答案:

答案 0 :(得分:3)

最简单的方法是使用javax.swing.Timer。定时器发送定期更新事件以更新GUI很容易,并且可以根据需要轻松停止或重置定时器。

答案 1 :(得分:1)

  

我读过SwingWorker似乎是我需要的。

我赞同@Ernest Friedman-Hill的javax.swing.Timer建议,但SwingWorker example值得探索。它可以帮助您利用现有的线程代码。

答案 2 :(得分:1)

首先,我想对大家说声谢谢。

这个问题是由我们的SwingWorker以这样的方式解决的:我作为 SwingWorker 的孩子开发的主要摇摆窗口。所有计算都在 doInBackground 方法中。在他们继续进行时,在SwingUtilities.invokeLater中调用了一个计时器(在一个单独的线程中)。在 done 方法中,当所有计算完成后,计时器停止。

答案 3 :(得分:0)

Swing计时器会或多或少地完成工作,但可能会有些不准确。实际上,这种不准确性是显而易见的。例如,如果您使用Swing Timer制作计时器,然后在勾选时观察数字,您可能会注意到它们并不总是在两个刻度之间。换句话说,计时器的分辨率不是那么好。

Swing Timer的替代方案是System.nanoTime()。我总是用这个。它具有更好的分辨率。它以纳秒为单位返回当前系统时间。

以下是一个快速示例,说明如何使用它来计算秒数:

long previousTime = 0L;
int seconds = 0;
while(true)
{
    long currTime = System.nanoTime();

    if((currTime - previousTime) / 1000000000L >= 1L)
    {
        previousTime = currTime;
        seconds++;
        System.out.println("Seconds: " seconds)
    }
}