插入DefaultTableModel的行不显示

时间:2019-10-11 13:22:44

标签: java swing jtable defaulttablemodel

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

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在主线程上运行,该线程必须用于UI更新,并且没有异常或错误消息。

1 个答案:

答案 0 :(得分:0)

修复了该问题-有两个原因导致其不起作用:

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

  2. process在调用publish()之后的一个看似随机的时间点被调用,并且无法事先告知将要有多少块(可能只有一个或全部) ,因此您必须确保在设置列后得到DefaultTableModel 。为保证这一点,可以在第一次调用publish()之前设置列(但仍在doInBackground之外-参见1),或者在{zero}时间调用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)进行设置(当然,在添加行之前)。