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