java - 插入到 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<Integer> li = chunks.listIterator();

        while(li.hasNext()) {
            dtm123.addRow(myDataList.get(li.next()).getRowArray());
        }                    
    }
}

dtm123.getRowCount() 每次都会增加(我检查过),但表格并未更新以实际显示新行。我尝试手动更新它,但这也不起作用:

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

这是奇怪的事情:如果我使用完整版本,它就可以很好地填充表格:

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

您不能使用较短的版本来填充表格吗? 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. 设置表的模型 (myTable.setModel(new DefaultTableModel(...add info here...));) 和创建列也必须在主/UI 线程上完成。

  2. process 在调用 publish() 之后在看似随机的时间点被调用,并且无法事先知道会有多少 block (可能只是其中一个或全部),因此您必须确保在设置列之后获得 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());
            }
        }
    }
}

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

关于java - 插入到 DefaultTableModel 中的行不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58342218/

相关文章:

java - Logstash TCP 输入与 JSON 编解码器将每一行视为一个单独的事件

java - 使用扫描仪读取并比较每行的最后一个标记

java - 我是如何得到 NullPointerException 的?使用 JApplet

java - 使用 netbeans 在 Jtextarea 中显示错误输出

java - 为什么Guava InputSupplier/OutputSupplier没有扩展Supplier接口(interface)?

java - Spring REST/Swagger/Postman - 正在下载损坏/空白文件

java - 使用paint(Graphics p)时删除java中的一行?

java - 如何在Jtable中动态添加列名称?

java - 刷新 JTable java 后更改列名

java - 如何动态更改jtable单元格背景