2

メールサーバーからのみすべてのヘッダーを取得するために、Javaで簡単なアプリケーションを作成しようとしています。実際には、DefaultTableModel を使用しているときに JTable にデータを表示する以外はすべてうまく機能します。ポイントは、メールボックスに約6kのメッセージがあることです:P. ダウンロード ヘッダー ボタンをトリガーすると、最後のメッセージが受信されるまで GUI がハングします。その後、JTable ですべてを正しく表示できます。JTable は、単一のメッセージからヘッダーを取得するたびに更新されません。すべてのメッセージがダウンロードされた後でのみ、GUI がハングします。何が起こっているのかを知るために、JTableに行を追加する別のアプリを書きました。GUIを更新するDelphiには単純な「Application.ProcessMessages」がありました...Java(swing)で同じことを達成する方法がわかりません..助けてください。コード :

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 を更新する最も簡単な方法は何ですか? よろしく

4

1 に答える 1

6

この質問はほぼ毎日聞かれます。イベント ディスパッチ スレッドで何かをしている場合 (6K メッセージの読み取りなど)、イベント ディスパッチ スレッドが GUI を再描画するのを妨げています。

長いタスクは、イベント ディスパッチ スレッドではなく、別のバックグラウンド スレッドで実行する必要があります。SwingWorker を使用します。その javadoc は、 swing チュートリアルと同様に、その使用方法を説明しています。

于 2013-01-19T21:29:46.430 に答える