插入 DefaultTableModel 的行不显示

Rows inserted into a DefaultTableModel don't show

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

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());
        }                    
    }
}

dtm123.getRowCount() 每次都会增加(我检查过),但 table 不会更新以实际显示新行。我试过手动更新,也没用:

dtm123.fireTableRowsInserted(0, dtm123.getColumnCount()-1);

奇怪的是:如果我使用完整版,它会很好地填充 table:

((DefaultTableModel) myTable.getModel()).addRow(myDataList.get(li.next()).getRowArray());

能不能不用短版填一个table? dtm123 没有在其他任何地方使用,那么这两个版本之间有什么区别?

编辑:

像这样直接填充它(没有 SwingWorker)有效:

myTable.setModel(new DefaultTableModel(
    new Object[][] {},
    new Object[] {"blaA","blaB","blaC"}
));

DefaultTableModel dtm123 = (DefaultTableModel) myTable.getModel();
dtm123.addRow(new String[] {"bla1A","bla1B","bla1C"});
dtm123.addRow(new String[] {"bla2A","bla2B","bla2C"});
dtm123.addRow(new String[] {"bla3A","bla3B","bla3C"});
dtm123.addRow(new String[] {"bla4A","bla4B","bla4C"});
dtm123.addRow(new String[] {"bla5A","bla5B","bla5C"});
dtm123.addRow(new String[] {"bla6A","bla6B","bla6C"});
dtm123.addRow(new String[] {"bla7A","bla7B","bla7C"});

看起来 SwingWoker 是问题所在,但为什么呢? process在主线程上是运行,必须用于UI更新,没有异常和错误信息。

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

  1. 设置 table (myTable.setModel(new DefaultTableModel(...add info here...));) 的模型和创建列也必须在 main/UI 线程上完成。

  2. process 在调用 publish() 之后在一个看似随机的时间点被调用,并且没有办法事先告诉会有多少块(可能只是一个或所有这些),因此您必须确保在设置列后DefaultTableModel 获得。为了保证这一点,要么在第一次调用 publish() 之前设置列(但仍在 doInBackground 之外 - 请参阅 1.),要么调用 publish 一次 "zeroth" 以设置它们(见下面的代码)。事后看来,这似乎很明显...

如果你像我一样使用 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());
            }
        }
    }
}

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