【问题标题】:Dynamically updating Jtable while adding row's in loop在循环中添加行时动态更新 Jtable
【发布时间】:2013-01-03 08:27:24
【问题描述】:

我正在尝试用 Java 编写简单的应用程序以仅从邮件服务器获取所有标头。实际上,除了在使用 DefaultTableModel 时在 JTable 中显示数据之外,一切都运行良好。 关键是我在邮箱中有大约 6k 条消息:P。当我触发下载标题按钮 GUI 挂起直到收到最后一条消息 - 然后我可以在 JTable 中正确看到所有内容。每次我从单个消息中获取标题时,JTable 都不会更新 - 仅在下载所有消息之后 - 直到 GUI 挂起。为了找出发生了什么,我编写了另一个应用程序,将行添加到 JTable。 Delphi 更新 GUI 中有简单的“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 的最简单方法是什么? 问候

【问题讨论】:

  • 当您在 EDT 中循环和调用 Thread.sleep 时,您如何期望任何重绘发生?这将阻止 EDT 处理绘制请求。请看一下Concurrency in Swing,尤其是关于 SwingWorker 的部分

标签: java swing swingworker


【解决方案1】:

这个问题几乎每天都会被问到。当您在事件调度线程中执行操作时(例如读取 6K 消息),您正在阻止事件调度线程重新绘制 GUI。

长任务不能在事件派发线程中完成,而应在单独的后台线程中完成。使用 SwingWorker。它的 javadoc 解释了如何使用它,以及 swing tutorial

【讨论】:

  • “这个问题几乎每天都会被问到......” ..除非那些日子它被问到两次或更多......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多