2010-07-01 34 views
3

我有一個GUI問題,我想要整理出來,但我很困惑,發生了什麼,希望你能解釋它。代碼基地太大,無法上傳,但我會詳細解釋發生了什麼事情:Java GUI JProgressBar沒有繪畫

我有一個類ProgessBar這是一個JDialog包含一個搖擺JProgressBar。我有一些getters和setter來改變酒吧到我的喜好,但這裏出現問題。當用戶點擊該按鈕

ProgressBar將一個方法myButtonActionPerformed

myButton.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       myButtonActionPerformed(evt); 
      } 
     }); 

基本上內部催生,處理開始並且ProgressBar被衍生。

用戶當前在它們前面有一個JFrame,並且此進度條彈出一個JDialog。在Netbeans中進入調試模式之後,我可以看到JProgressBar的值發生了變化,但是當我的程序正在處理時,它的視覺保持在0%,然後在離開上面的添加動作偵聽器方法時立即跳到100%,幾乎就好像它正在等待重畫,直到從那個聆聽者那裏出來。我不瞭解什麼?有什麼我可以調用,這將迫使它在這個myButtonActionPerformed方法內更新,而不是等到它沒用。

回答

5

你在美國東部時間做任何事情嗎?請記住,AWT/Swing有專門的線程來完成GUI工作 - 處理事件處理程序,重繪GUI等。如果您在該線程上執行長時間運行的任務,Swing將不會重新繪製。

嘗試在另一個線程中執行您的任務並相應地更新進度條。但是,使用SwingUtilities.invokeLaterinvokeAndWait來更新進度欄,以確保GUI更新發生在EDT上。否則,事情變得很奇怪。

+0

非常感謝,這聽起來很合理。我查了一下你給我的一些東西,發現這個鏈接對將來通過這個論壇主題進行查看的任何人都很有用:http://java.sun.com/developer/technicalArticles/javase/swingworker/#EDT – Ryan 2010-07-01 03:20:39

+0

@瑞恩:是的,我應該提到'SwingWorker'。道歉。是的,我想這個鏈接可以讓你在這裏找到正確的方向。 – Joey 2010-07-01 03:31:31

1

它沒有更新的原因是因爲您的UI線程在執行處理的ActionPerformed偵聽器中很忙。如果您嘗試與應用程序進行交互,您會注意到UI上的任何內容都無法響應。

對此的解決方案是不在UI線程上處理 - 啓動另一個線程,對其執行處理,然後回調到UI線程以更新進度欄。

1

首先,您的匿名ActionListener只是轉發到一個名爲myButtonActionPerformed的方法,顯然這個問題不在發佈的代碼中,而是發生在或發生在myButtonActionPerformed內部的事件中。所以這將是相關的代碼發佈(如果可能)。

其他人可能已經釘住了這一點,因爲美國東部時間可能確實是重度加工。可以使用SwingWorkers將進度/狀態更新有效地路由到GUI線程,並將背景處理從EDT移開。

第三:出於興趣,您碰巧使用NetBeans進行GUI設計嗎?看起來像它自動生成的代碼,對我來說。

+0

是的,我也使用netbeans進行設計。 – Ryan 2010-07-01 03:52:13