Java 插入到DefaultTableModel中的行不';不显示

Java 插入到DefaultTableModel中的行不';不显示,java,swing,jtable,defaulttablemodel,Java,Swing,Jtable,Defaulttablemodel,在我的Java 8应用程序中,我使用SwingWorker从数据库中获取一些数据,并在知道整行数据后调用publish,然后将其添加到我的表中: DefaultTableModel dtm123 = (DefaultTableModel) myTable.getModel(); @Override protected void process(List<Integer> chunks) { if(chunks!=null) { ListIterator<

在我的Java 8应用程序中,我使用
SwingWorker
从数据库中获取一些数据,并在知道整行数据后调用
publish
,然后将其添加到我的表中:

DefaultTableModel dtm123 = (DefaultTableModel) myTable.getModel();

@Override
protected void process(List<Integer> chunks) {
    if(chunks!=null) {
        ListIterator<Integer> li = chunks.listIterator();

        while(li.hasNext()) {
            dtm123.addRow(myDataList.get(li.next()).getRowArray());
        }                    
    }
}
奇怪的是:如果我使用完整版本,它会很好地填满表格:

((DefaultTableModel) myTable.getModel()).addRow(myDataList.get(li.next()).getRowArray());
不能用较短的版本填写表格吗
dtm123
没有在其他任何地方使用,那么这两个版本之间的区别是什么

编辑:

这样直接填充(不使用
SwingWorker
)可以:


看起来问题出在
SwingWoker上,但为什么呢<代码>进程
在主线程上运行,必须用于UI更新,并且没有异常或错误消息。

修复了它-它不起作用的原因有两个:

  • 设置表的模型(
    myTable.setModel(新的DefaultTableModel(…在此添加信息…);
    )和创建列也必须在主/UI线程上完成

  • 调用
    publish()
    后,
    process
    在一个看似随机的时间点上被调用,并且无法预先知道将有多少块(可能只是一块或全部),因此您必须确保在设置列后获得
    DefaultTableModel
    。为了保证这一点,您可以在第一次调用
    publish()
    之前设置列(但仍在
    doInBackground
    -请参见1.)或调用
    publish
    进行“第零次”设置(请参见下面的代码)。事后看来,这似乎很明显

  • 如果您使用的是像我一样的
    SwingWorker
    ,您可以按照以下方式进行操作:

    DefaultTableModel dtm123;
    
    @Override
    protected void process(List<Integer> chunks) {
        if(chunks!=null) {
            ListIterator<Integer> li = chunks.listIterator();
            int next;
    
            while(li.hasNext()) {
                next = li.next();
    
                if(next==-1) {
                    //Set up columns/column titles here
                    myTable.setModel(new DefaultTableModel(
                        new Object[][] {},
                        columnHeaderArray
                    ));
                    dtm123 = (DefaultTableModel) myTable.getModel();
                } else {
                    //Add new rows here
                    dtm123.addRow(myDataList.get(next).getRowArray());
                }
            }
        }
    }
    
    defaultTableModelDTM123;
    @凌驾
    受保护的无效进程(列表块){
    if(块!=null){
    ListIterator li=chunks.ListIterator();
    int-next;
    while(li.hasNext()){
    next=li.next();
    如果(下一个==-1){
    //在此处设置列/列标题
    setModel(新的DefaultTableModel(
    新对象[][]{},
    圆柱头阵列
    ));
    dtm123=(DefaultTableModel)myTable.getModel();
    }否则{
    //在此处添加新行
    addRow(myDataList.get(next.getRowArray());
    }
    }
    }
    }
    

    像往常一样使用
    publish
    ,但一旦知道列的标题,请调用
    publish(-1)
    进行设置(当然,在添加行之前)。

    修复了它-它不起作用的原因有两个:

  • 设置表的模型(
    myTable.setModel(新的DefaultTableModel(…在此添加信息…);
    )和创建列也必须在主/UI线程上完成

  • 调用
    publish()
    后,
    process
    在一个看似随机的时间点上被调用,并且无法预先知道将有多少块(可能只是一块或全部),因此您必须确保在设置列后获得
    DefaultTableModel
    。为了保证这一点,您可以在第一次调用
    publish()
    之前设置列(但仍在
    doInBackground
    -请参见1.)或调用
    publish
    进行“第零次”设置(请参见下面的代码)。事后看来,这似乎很明显

  • 如果您使用的是像我一样的
    SwingWorker
    ,您可以按照以下方式进行操作:

    DefaultTableModel dtm123;
    
    @Override
    protected void process(List<Integer> chunks) {
        if(chunks!=null) {
            ListIterator<Integer> li = chunks.listIterator();
            int next;
    
            while(li.hasNext()) {
                next = li.next();
    
                if(next==-1) {
                    //Set up columns/column titles here
                    myTable.setModel(new DefaultTableModel(
                        new Object[][] {},
                        columnHeaderArray
                    ));
                    dtm123 = (DefaultTableModel) myTable.getModel();
                } else {
                    //Add new rows here
                    dtm123.addRow(myDataList.get(next).getRowArray());
                }
            }
        }
    }
    
    defaultTableModelDTM123;
    @凌驾
    受保护的无效进程(列表块){
    if(块!=null){
    ListIterator li=chunks.ListIterator();
    int-next;
    while(li.hasNext()){
    next=li.next();
    如果(下一个==-1){
    //在此处设置列/列标题
    setModel(新的DefaultTableModel(
    新对象[][]{},
    圆柱头阵列
    ));
    dtm123=(DefaultTableModel)myTable.getModel();
    }否则{
    //在此处添加新行
    addRow(myDataList.get(next.getRowArray());
    }
    }
    }
    }
    
    像往常一样使用
    publish
    ,但一旦知道列的标题,请调用
    publish(-1)
    进行设置(当然,在添加行之前)

    DefaultTableModel dtm123;
    
    @Override
    protected void process(List<Integer> chunks) {
        if(chunks!=null) {
            ListIterator<Integer> li = chunks.listIterator();
            int next;
    
            while(li.hasNext()) {
                next = li.next();
    
                if(next==-1) {
                    //Set up columns/column titles here
                    myTable.setModel(new DefaultTableModel(
                        new Object[][] {},
                        columnHeaderArray
                    ));
                    dtm123 = (DefaultTableModel) myTable.getModel();
                } else {
                    //Add new rows here
                    dtm123.addRow(myDataList.get(next).getRowArray());
                }
            }
        }
    }