2011-05-22 34 views
3

我在刷新鼠標動作事件處理程序中的組件時遇到問題。問題在於,在jButton1MouseClicked()完成後,所有在此函數中更改的jLabel都會顯示其更改。這裏是我的功能:如何立即更改MouseEvent處理程序中jLabel的文本?

private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {          

    int cycles = Integer.parseInt(c.settings.get("cycles")); 
    statusMessageLabel.setText("Data collection in progress..."); 

    for(int i=1;i <= Integer.parseInt(c.settings.get("cycles"));i++) { 

     jLabelCycle.setText(Integer.toString(i)); 

     //here are some functions which are implementing data collection 


     if(i < cycles){ 
      int counter = Integer.parseInt(c.settings.get("interval")); 
      while(counter >= 0){ 
       jLabelTimer.setText(Integer.toString(counter)); 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException ex) { 
        Logger.getLogger(AppCView.class.getName()).log(Level.SEVERE, null, ex); 
       } 
       counter--; 
      } 
     } 

    } 
    statusMessageLabel.setText("Data collection has been finished."); 
}  

你能幫我嗎?我真的需要這個變化是可見的,因爲一個jLabel可視化計數直到下一個循環,第二個可視化實際循環數。我改變了他們之後,我嘗試了所有jLabel上的調用函數repaint(),但它沒有幫助。

謝謝大家的幫助。

回答

6

在AWT中,與大多數其他GUI系統非常相似,所有事件(包括重繪)都是在單線程AWT事件調度線程(EDT)上完成的。您在事件偵聽器中阻止該線程,因此標籤上的重新繪製事件無法通過。

我建議您重寫您的代碼以使用javax.swing.Timer而不是Thread.sleep

一般來說,長時間運行的操作應該在單獨的線程上處理。任何觸及AWT或Swing組件的操作都應該排隊等待在AWT EDT上運行,使用java.awt.EventQueue.invokeLater

+0

我讀了關於swingtimer,但我沒有得到如何可以實現它到我的應用程序。比方說,當我定義需要制定的任務時,我將創建班級收集器。但是,如何用swingtimer更改該類中的Swing應用程序的jLabels? – 2011-05-22 09:10:07

+0

@PetrVelký,根本不是真的,在右邊你可以看到相關的線程,檢查之前發佈**** ***這裏 – mKorbel 2011-05-22 10:56:20

+0

你之前發佈**** ***是什麼意思? – 2011-05-22 15:37:09

相關問題