我正在尝试用Java编写简单的应用程序,只从邮件服务器获取所有标头。实际上一切正常,除了在使用DefaultTableModel时在JTable中显示数据。 关键是我在邮箱中有大约6k条消息:P。当我触发下载标题按钮GUI挂起,直到收到最后一条消息 - 然后我可以在JTable中正确查看所有内容。每当我从单个消息中获取头时,JTable就不会更新 - 只有在所有消息都被下载之后 - 直到GUI挂起。为了找出发生了什么,我写了另一个应用程序,将行添加到JTable。在Delphi中有简单的“Application.ProcessMessages”更新GUI ...我不知道如何在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的最简单方法是什么? 此致
答案 0 :(得分:6)
几乎每天都会问这个问题。当您在事件调度线程中执行操作(如读取6K消息)时,您将阻止事件调度线程重新绘制GUI。
长任务不能在事件派发线程中完成,而是在单独的后台线程中完成。使用SwingWorker。它的javadoc解释了如何使用它,以及swing tutorial。