我有一個JFrame
,其中CardLayout
設置爲其佈局管理器。這裏有兩個JPanel
的子類。一個是面板,WordsLoadingPanel
,它顯示文本「加載單詞...」,並有一個JProgressBar
。另一個必須實際加載單詞。這需要一段時間(對於100個單詞大約10-14秒;這是一個非常有選擇性的算法),所以我想向用戶保證程序仍在工作。我使面板中的加載算法觸發了屬性更改firePropertyChange(String, int, int)
,並且WordsLoadingPanel
正在捕獲更改 - 我知道這是因爲我添加了此事件的偵聽器以執行println
,並且它可以工作。但是,當我將println
更改爲實際更改JProgressBar
的值時,它什麼也不做。我知道我正在改變這個值,因爲如果我在算法啓動之前設置了它的值,它將起作用,和它在循環的最後一次迭代中起作用。我猜這是因爲我的算法正在消耗計算能力,不會讓JProgressBar
更新。等待Swing在繼續之前完成更新JProgressBar
所以,我的問題是:如何讓我的算法等待Swing(這將是AWT調度線程?)在繼續之前完成更新進度欄?我已經試過:
- 在循環
- 在每個循環迭代
Thread.sleep(1000L)
的每次迭代Thread.yield
,在一個try/catch - 把一切在循環中
SwingUtilities.invokeLater(Runnable)
- 只把CPU密集型算法在一個
SwingUtilities.invokeLater(Runnable)
編輯:爲了進一步支持我的假設的CPU吃算法(聽起來像一個孩子的故事...),當我將JProgressBar
設置爲不確定時,只在算法完成後纔開始移動。
有沒有人有任何建議?
謝謝!
謝謝,我會研究這個! – wchargin
雖然我仍然對「SwingWorker」的工作原理感到困惑。我有一個'SwingWorker,Void>'帶有'ArrayList doInBackground()'和一個'void process(List chunks)'。什麼是「列表」的說法?何時調用「進程」?我似乎無法理解您從我提供的鏈接(文檔)或維基百科。你能再解釋一下嗎?謝謝! –
wchargin
也請記住,這不是一個大的任務,這是一個小百的任務(約1/4秒每個)。 – wchargin