2011-01-22 124 views
3

我正在構建一個Java程序,從服務器下載N個元素。我想有一個工作進度條,顯示「已下載的元素」/ N個百分比。現在,我通過向線程傳遞對GUI對象的引用來更新進度條值,但它會使代碼變得「醜陋」(GUI類創建線程,該線程包含對GUI本身的引用,從而創建一種循環)。 有沒有更好的方法來做到這一點?從工作線程更新進度條

回答

2

閱讀的JProgressBar API,並按照有關如何使用進度條的工作示例的鏈接Swing指南。

+0

將您的更新發布到EDT上的任何Swing組件。需要鏈接。 – 2011-01-23 00:47:03

2

爲了去除「循環」。創建一個傳遞給工作線程的GUI擴展接口。

0

一個設計模式是監聽器模式。用工作線程註冊一個進度監聽器。然後,監聽器負責發佈到GUI(或其他任何可能感興趣的進展)。

因爲在這種情況是極不可能的,你有多個監聽器,它往往是最好只具有單一的監聽器(降低複雜性和開銷)。

在我的應用程序,長時間運行的操作,通過傳遞ProgressTracker(:百分比和狀態文本里面有兩個事件類型)調用。這些信息用於更新JProgressBar,JLabel,無論如何......我還使用ProgressTracker檢查操作是否應該取消。

的SwingWorker確實有一些代碼,以合併多個更新幫助 - 但它周圍的假設,長時間運行的任務應該從SwingWorker的,這不利於關注點分離繼承建。這真的取決於你朝哪個方向前進 - 我個人更喜歡對我的數據進行的操作,而與GUI無關。

請記住使用SwingUtilities.invokeLater()