【发布时间】:2011-03-22 20:53:14
【问题描述】:
我有一个基于 Swing 的带有 GUI 的 java 程序。在主类中,有一些计算被分组在一个单独的线程中。我的问题是:我需要在这些计算开始时启动秒表,在它们进行时显示计时器,在它们完成时停止。 如果我只需要计算剩下的时间,我会在单独的线程中启动秒表,在主线程中进行所有计算,当它们完成时停止秒表线程并显示计时器。 据我所知,java swing 是单线程的。这样我就可以在主摆动中重新绘制秒表的数字
【问题讨论】:
我有一个基于 Swing 的带有 GUI 的 java 程序。在主类中,有一些计算被分组在一个单独的线程中。我的问题是:我需要在这些计算开始时启动秒表,在它们进行时显示计时器,在它们完成时停止。 如果我只需要计算剩下的时间,我会在单独的线程中启动秒表,在主线程中进行所有计算,当它们完成时停止秒表线程并显示计时器。 据我所知,java swing 是单线程的。这样我就可以在主摆动中重新绘制秒表的数字
【问题讨论】:
最简单的方法是使用 javax.swing.Timer。让 Timer 发送定期更新事件来更新 GUI 很容易,并且可以根据需要轻松停止或重置计时器。
【讨论】:
我读到
SwingWorker似乎是我需要的。
我会支持@Ernest Friedman-Hill 的javax.swing.Timer 建议,但这个SwingWorker example 值得探索。它可以帮助您利用现有的线程代码。
【讨论】:
首先,我想对大家说声谢谢。
使用 SwingWorker 以这样的方式解决了这个问题:我作为 SwingWorker 的孩子开发的主摆动窗口。所有的计算都在 doInBackground 方法中。当他们继续进行时,在 SwingUtilities.invokeLater 中调用了一个计时器(它在一个单独的线程中)。在 done 方法中,当所有计算完成时,计时器停止。
【讨论】:
Swing 计时器或多或少可以完成这项工作,但它可能有些不准确。事实上,这种不准确是显而易见的。例如,如果您使用 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)
}
}
【讨论】: