2013-01-19 51 views
2

我試圖在Java中編寫簡單的應用程序以僅從郵件服務器獲取所有標題。事實上,除了在使用DefaultTableModel時在JTable中顯示數據之外,所有的工作都很好。 重點是我在郵箱中有大約6k條消息:P。當我觸發下載頭按鈕GUI掛起,直到收到最後一條消息 - 然後我可以在JTable中正確地看到一切。每當我從單個消息中獲取標題時,JTable就不會更新 - 只有在所有消息都已下載完畢後 - 纔會掛起GUI。爲了找出發生了什麼,我寫了另一個應用程序添加行到JTable。在Delphi更新GUI中有簡單的「Application.ProcessMessages」...我不知道如何在java(swing)中實現相同的功能..請幫助。 代碼:在循環中添加行時動態更新Jtable

import java.util.logging.Level;   
import java.util.logging.Logger;    
import javax.swing.table.DefaultTableModel; 
public class NewApplication extends javax.swing.JFrame { 
String[] in; 
public NewApplication() { 
    initComponents(); 
}               

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
in=new String[5];  
in[0]="0"; 
in[1]="1"; 
in[2]="2"; 
in[3]="3"; 
in[4]="4"; 
for(Integer r=0;r<5000;r++) 
{ 
     try { 
      add(in);    
      Thread.sleep(5); 
     } 
     catch (InterruptedException ex) { 
      Logger.getLogger(NewApplication.class.getName()).log(Level.SEVERE, null,  ex); 
     } 
} 
}           

public void add(String[] in) 
{ 
    DefaultTableModel model = (DefaultTableModel) jTable1.getModel(); 
    model.addRow(new Object[]{in[0], in[1], in[2],in[3],in[4]}); 
} 
public static void main(String args[]) { 

    java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      new NewApplication().setVisible(true); 
     } 
    }); 
} 
} 

什麼是增加單排後更新JTable中simpliest方式? Regards

+2

你剛纔是如何期待在你循環並調用EDT中的Thread.sleep時發生重繪?這將阻止EDT處理繪畫請求。請看看[併發中的Swing](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html),特別是關於SwingWorker的部分 – MadProgrammer

回答

6

幾乎每天都會問這個問題。當你在事件派發線程中做事時(比如讀6K消息),你會阻止事件派發線程重新繪製GUI。

長時間的任務不能在事件分派線程中完成,而是在一個單獨的後臺線程中完成。使用SwingWorker。它的javadoc解釋瞭如何使用它,以及swing tutorial

+1

*「幾乎每天都會問到這個問題。 「* ..barring那些日子,它被問了兩次或更多.. –