2010-11-11 110 views
5

我正在處理一個項目,並且在while循環中將行添加到JTable中。Swing JTable更新

我的方案是這樣的: -

一旦用戶點擊一個按鈕程序進入一個while()循環,並開始通過一個添加行到JTable之一的DefaultTableModel直到while循環終止。 但問題是隻有在while循環結束後,表纔會更新數據。我希望在添加每行後將其更新並在UI上顯示。

這將是非常好的,如果有人可以幫助我這提供了一個解決方案

我已經嘗試重繪()將每行之後,但沒有奏效。

+0

你的while循環需要多長時間? – 2010-11-11 06:40:22

回答

7

您需要在單獨的線程中運行您的操作,然後在gui線程中更新JTable。類似這樣的:

public void someButtonClicked(params...) { 
    new Thread(new Runnable() { 
     public void run() { 
      longOperation(); 
     } 
    }).start(); 
} 

public void longOperation() { 
    for(int i=0; i<1000; i++) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       // add new row to jtable 
      } 
     }); 
    } 
} 
+0

謝謝傑可你救了我的一天現在它的工作 – Jinith 2010-11-11 06:55:30

+0

感謝您的時間和努力 - 讚賞 – Jinith 2010-11-11 06:56:09

0

如果您的整個while循環在Swing事件分派線程上運行以響應按鈕單擊事件,則線程將不會自由更新屏幕上的視圖,直到事件處理代碼完成(您的結束actionPerformed方法)。

我不確定你要在這裏完成什麼 - 動畫也許?你可以使用Swing的Timer類(javax.swing.Timer)來重複觸發一個事件,在觸發之間有一個小的延遲,並且爲了響應每個事件,你可以在表中添加一行。只要事件處理代碼響應每個事件觸發而迅速退出,Swing應該能夠在事件之間重新繪製視圖。你真的需要很好地理解Swing的線程模型,或者這些類型的問題真的很混亂。這並不難 - 如果您搜索了例如「 「Swing事件線程」。 ()和其他方法(如validate()等)只會將組件標記爲需要重新繪製 - 組件不會實際上在屏幕上進行重新繪製,直到Swing有機會做到這一點,並且如果您在while循環中陷印Swing線程,則在完成循環和事件處理代碼完成之前,繪畫將不會自由進行繪製。