2013-05-06 68 views
0

我試圖更新我的Java Swing表單中的for。我嘗試了很多方法,但沒有奏效。這是我最後一次嘗試:Swing,更新文本框的值爲

for(int i=0; i<10; i++) { 
    jTextField1.setText("" + i); 

    try { 
     Thread.sleep(500); 
    } 
    catch (InterruptedException ex) { 
     Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 
+4

不要堵塞EDT(事件指派線程) - 的圖形用戶界面將 '凍結' 當這種情況發生。而不是調用'Thread.sleep(n)'實現一個Swing'Timer'來重複執行任務,或者一個'SwingWorker'執行長時間運行的任務。有關更多詳細信息,請參見[Swing中的併發](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)。 – 2013-05-06 17:35:31

+0

可能的重複[如何每次更新jLabel帶有延遲的while循環](http://stackoverflow.com/questions/7251675/how-to-update-a-jlabel-every-time-with-a -with-delay-while-loop-with-a-delay)(和許多其他類似問題) – 2013-05-06 17:39:09

+0

感謝您的回覆。我會看看我能用Timer做些什麼。問題是我在一個循環中進行數學計算,所以我不知道如何用Timer來實現。 – SpartakusMd 2013-05-06 17:46:36

回答

1

你不能讓你的jTextField1變量爲'final',但你可以使用一個局部變量聲明爲final並且設置爲你的jTextField1變量,如下所示......我在編碼中多次使用這種方法,它可以工作。 ..

 
final jTextField local_var = jTextField1;

SwingUtilities.invokeLater(new Runnable() {

public void run() {

for (int i=0; i<10; i++) { local_var.setText("" + i); }});

0

我想你試圖從外部線程更新組件。一般來說,Swing不是線程安全的,更多細節請看this。關於你的代碼,嘗試採用這種做法:

for(int i=0; i<10; i++) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      jTextField1.setText("" + i); 
     } 
    }); 
} 

變量jTextField1必須聲明爲final

+0

剛剛嘗試過。如果我聲明'jTextField1'爲'final',那麼字段初始化失敗。無法將值分配給最終變量。 – SpartakusMd 2013-05-06 17:59:29

+0

您可以創建實現Runnable的類並以jTextField1作爲參數。 – Eugene 2013-05-06 18:31:24