在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更新,并且没有异常或错误消息。 最佳答案
修复了它-无效的两个原因:
设置表的模型(myTable.setModel(new DefaultTableModel(...add info here...));
)和创建列也必须在主/ UI线程上完成。
在调用process
之后,在一个看似随机的时间点调用了publish()
,并且无法事先告知将要有多少块(可能只有一个或全部),因此必须确保获得设置列后的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/