Java 插入到DefaultTableModel中的行不';不显示
在我的Java 8应用程序中,我使用Java 插入到DefaultTableModel中的行不';不显示,java,swing,jtable,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<
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());
}
}
}
奇怪的是:如果我使用完整版本,它会很好地填满表格:
((DefaultTableModel) myTable.getModel()).addRow(myDataList.get(li.next()).getRowArray());
不能用较短的版本填写表格吗dtm123
没有在其他任何地方使用,那么这两个版本之间的区别是什么
编辑:
这样直接填充(不使用SwingWorker
)可以:
看起来问题出在
SwingWoker上,但为什么呢<代码>进程
在主线程上运行,必须用于UI更新,并且没有异常或错误消息。修复了它-它不起作用的原因有两个:
myTable.setModel(新的DefaultTableModel(…在此添加信息…);
)和创建列也必须在主/UI线程上完成publish()
后,process
在一个看似随机的时间点上被调用,并且无法预先知道将有多少块(可能只是一块或全部),因此您必须确保在设置列后获得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());
}
}
}
}
defaultTableModelDTM123;
@凌驾
受保护的无效进程(列表块){
if(块!=null){
ListIterator li=chunks.ListIterator();
int-next;
while(li.hasNext()){
next=li.next();
如果(下一个==-1){
//在此处设置列/列标题
setModel(新的DefaultTableModel(
新对象[][]{},
圆柱头阵列
));
dtm123=(DefaultTableModel)myTable.getModel();
}否则{
//在此处添加新行
addRow(myDataList.get(next.getRowArray());
}
}
}
}
像往常一样使用
publish
,但一旦知道列的标题,请调用publish(-1)
进行设置(当然,在添加行之前)。修复了它-它不起作用的原因有两个:
myTable.setModel(新的DefaultTableModel(…在此添加信息…);
)和创建列也必须在主/UI线程上完成publish()
后,process
在一个看似随机的时间点上被调用,并且无法预先知道将有多少块(可能只是一块或全部),因此您必须确保在设置列后获得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());
}
}
}
}
defaultTableModelDTM123;
@凌驾
受保护的无效进程(列表块){
if(块!=null){
ListIterator li=chunks.ListIterator();
int-next;
while(li.hasNext()){
next=li.next();
如果(下一个==-1){
//在此处设置列/列标题
setModel(新的DefaultTableModel(
新对象[][]{},
圆柱头阵列
));
dtm123=(DefaultTableModel)myTable.getModel();
}否则{
//在此处添加新行
addRow(myDataList.get(next.getRowArray());
}
}
}
}
像往常一样使用publish
,但一旦知道列的标题,请调用publish(-1)
进行设置(当然,在添加行之前)
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());
}
}
}
}