2015-10-13 84 views
0

我想要創建一個小循環,在按下GUI上的按鈕之後,每秒的值都會改變;我曾嘗試使用線程,但我似乎無法讓它正常工作。現在發生的情況是,程序在按下按鈕之後會暫停10秒。你可以幫幫我嗎?Java:在線程中更改標籤值

這是我的代碼是什麼樣子

private void ButtonActionPerformed(java.awt.event.ActionEvent evt) { 

for (x = 0; x <= 10; x++) 
    { 

     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
      Thread.currentThread().interrupt(); here. 
     } 


     nummerlabel.setText(String.valueOf(x)); 
    } 



} 

回答

2

我想你要找的是什麼Timer類自帶的swing包。有一個閱讀the documentation,它應該幫助你解決你的問題。

1

一個簡單的規則是使用一個ExecutorService並將您的代碼作爲可運行的代碼運行。這並不會阻止程序的全球流動。記得關閉執行器。

private void ButtonActionPerformed(java.awt.event.ActionEvent evt) { 

    ExecutorService executorService = Executors.newFixedThreadPool(1);  
    for (int x = 0; x <= 10; x++) {  
     final int y=x; 
     executorService.execute(new Runnable() { 
      public void run() { 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      //nummerLabel should be accessed via final reference       
      nummerlabel.setText(String.valueOf(y)); 
      } 
     }); 

    } 
    executorService.shutdown(); 

} 
+0

'一個簡單的規則......'重要的規則是Swing組件應該在'Event Dispatch Thread'上更新。從我所知道的Executor服務不在EDT上運行,因此不應該更新Swing組件。 – camickr

+0

你能提出一些方法或方法來使這個程序工作? –

+0

@KaspervanderHoofd,「你能提出一些方法或方法來使這個程序有效嗎?」Jimmy在一小時前給出了答案。 – camickr

0

在動作監聽器(或任何事件處理程序)調用Thread.sleep()會導致程序無響應的睡眠()調用的持續時間。

像Java Swing這樣的GUI框架通常具有一個可處理所有鍵盤和鼠標輸入的事件調度線程(EDT)。事件處理程序在 EDT中被稱爲,並且由於只有一個EDT,所以它們必須一次調用一個。直到當前事件的處理程序返回,您的程序才能響應下一個事件。

像吉米Jutt他回答說,正確的方法,以使事情發生後,或在一個GUI程序的週期間隔是使用某種類型的定時器(例如,javax.swing.Timer)。定時器可用於安排將來的定時事件,您可以使用與編寫鍵盤和鼠標事件的處理程序相同的方式編寫處理函數。

0
private void ButtonActionPerformed(java.awt.event.ActionEvent evt) { 

    Thread thread = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       for (int i = 0; i <= 10; i++) { 
        nummerlabel.setText(String.valueOf(i)); 

        TimeUnit.SECONDS.sleep(1); 
       } 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 

    thread.start(); 
}