2012-07-25 59 views
0

我需要更改jlabel.text幾次通過單擊按鈕在揮杆。在這段代碼中,我需要的標籤文本之前的DoWork()函數啓動,並在中間的進度設置,並設置它的DoWork後結束()(狀態類型的JLabel和DoWork的有很長一段時間執行):幾次改變標籤文本通過單擊按鈕在揮杆不工作

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 
     status.setText("start"); 
     try { 
      Thread.sleep(10000); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(PelakInRFID.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     status.setText("in progress"); 
     dowork(); 
     try { 
      Thread.sleep(10000); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(PelakInRFID.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     status.setText("end"); 

} 

在此代碼狀態下,只設置爲結束並且不顯示開始。

+0

請參閱[進度教程](http://docs.oracle.com/javase/tutorial/uiswing/components/progress.html)關於如何顯示進度,或查看可用示例,例如[this酮](http://stackoverflow.com/questions/8916721/java-swing-update-label/8917565#8917565) – Robin 2012-07-25 20:32:50

回答

2

我會嘗試使用SwingWorker實例(特別是其doInBackground方法)來完成目前你正在做什麼doWork在不同的線程比主UI線程。它的寫法是,你的監聽器方法在執行期間必然會凍結用戶界面,正如你所說,這可能會很長時間,導致用戶體驗不好。

更改爲JLabel文本可能發生在三個不同的地方:第一,就在調用execute之前(即啓動)SwingWorker;第二,使用/process機制SwingWorker可用於在用戶界面上發佈中間結果;第三,在done方法中,只要SwingWorker完成其doInBackground方法的執行,就會在UI線程上再次調用該方法。

參考文獻:Oracle的教程worker threads and SwingWorker,JavaDoc API documentation of the SwingWorker class

2

永遠,永遠使用Thread.sleepThead.yieldETD

永遠,永遠執行在ETD任何阻塞動作,諸如擴展的IO或數據處理

該標籤沒有變化的原因是因爲您正在阻止/阻止ETD,阻止它處理任何重新繪製請求。

退房Concurrency in Swing & The Event Dispatching Thread