插入到 DefaultTableModel 中的行不显示

在我的 Java 8 应用程序中,我使用 aSwingWorker从数据库获取一些数据,并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 更新,并且没有异常或错误消息。


慕斯王
浏览 38回答 1
1回答

一只名叫tom的猫

修复了它 - 有两个原因导致它不起作用:设置表的模型 (&nbsp;myTable.setModel(new DefaultTableModel(...add info here...));) 和创建列也必须在主/UI 线程上完成。process在调用后看似随机的时间点被调用publish(),并且无法事先知道将有多少块(可能只是其中一个或全部),因此您必须确保在设置DefaultTableModel&nbsp;后获得列。publish()为了保证这一点,要么在第一次调用之前设置列(但仍在外部doInBackground- 请参阅 1.),要么调用publish“第零次”时间来设置它们(请参阅下面的代码)。事后看来,这似乎很明显......如果您像我一样使用SwingWorker,您可以执行以下操作:DefaultTableModel dtm123;@Overrideprotected void process(List<Integer> chunks) {&nbsp; &nbsp; if(chunks!=null) {&nbsp; &nbsp; &nbsp; &nbsp; ListIterator<Integer> li = chunks.listIterator();&nbsp; &nbsp; &nbsp; &nbsp; int next;&nbsp; &nbsp; &nbsp; &nbsp; while(li.hasNext()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; next = li.next();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(next==-1) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Set up columns/column titles here&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; myTable.setModel(new DefaultTableModel(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new Object[][] {},&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; columnHeaderArray&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dtm123 = (DefaultTableModel) myTable.getModel();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Add new rows here&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dtm123.addRow(myDataList.get(next).getRowArray());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}像往常一样使用publish,但一旦您知道列的标题,请调用publish(-1)以设置它们(当然,在添加行之前)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java