插入 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更新,没有异常和错误信息。
已修复 - 它不起作用的原因有两个:
设置 table (myTable.setModel(new DefaultTableModel(...add info here...));
) 的模型和创建列也必须在 main/UI 线程上完成。
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)
来设置它们(当然,在您添加行之前)。
在我的 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更新,没有异常和错误信息。
已修复 - 它不起作用的原因有两个:
设置 table (
myTable.setModel(new DefaultTableModel(...add info here...));
) 的模型和创建列也必须在 main/UI 线程上完成。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)
来设置它们(当然,在您添加行之前)。