簡體   English   中英

Java Swing:事件調度線程VS秒表

[英]Java Swing: Event-Dispatching Thread VS Stopwatch

我有一個帶有基於Swing的GUI的Java程序。 在主類中,一些計算被分組在單獨的線程中。 我的問題是:這些計算開始時,我需要啟動秒表,在進行過程時顯示計時器,在完成時停止。 如果只需要計算剩余時間,我將在單獨的線程中啟動秒表,在主線程中執行所有計算,並在它們停止時停止秒表線程並顯示計時器。 據我所知,java swing是單線程的。 這樣我就可以在主揮桿上重新粉刷秒表的數字

最簡單的方法是使用javax.swing.Timer。 讓計時器發送定期的更新事件以更新GUI很容易,並且可以根據需要停止或重置計時器。

我讀過SwingWorker似乎正是我所需要的。

我會支持@Ernest Friedman-Hill的javax.swing.Timer建議,但是這個SwingWorker 示例值得探討。 它可以幫助您利用現有的線程代碼。

首先,我想對大家說謝謝。

usind SwingWorker通過以下方式解決了該問題:我是SwingWorker的孩子開發的主擺動窗口。 所有的計算都在doInBackground方法中。 在它們進行時,在SwingUtilities.invokeLater中調用了一個計時器(在單獨的線程中)。 完成方法中,當所有計算完成時,計時器停止運行。

Swing計時器或多或少會完成這項工作,但是可能有些不准確。 實際上,這種不准確性可能很明顯。 例如,如果您使用Swing計時器制作計時器,然后看着數字滴答作響,您可能會注意到,滴答之間的間隔並不總是一秒鍾。 換句話說,計時器的分辨率不是很好。

Swing計時器的替代方法是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)
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM