我有一个名为JTable
的自定义TableModel
的DataTableModel
。我用一组列名和没有数据的表来初始化表,如下所示:
books = new JTable(new DataTableModel(new Vector<Vector<String>>(), title2));
JScrollPane scroll1 = new JScrollPane(books);
scroll1.setEnabled(true);
scroll1.setVisible(true);
JSplitPane jsp1 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, scroll1, scroll2);
JSplitPane jsp2 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, inventory, jsp1);
myPanel.add(jsp2, BorderLayout.CENTER);
稍后,我想用一组数据更新书籍,并使用以下内容:
DataTableModel d = (DataTableModel)books.getModel();
d.setValues(bookList);
books.setModel(d);
其中bookList是一个肯定包含数据的
Vector<Vector<String>>
。但是,尽管所有这些代码都正在执行,但它并未显示在屏幕上。 setValues()
方法的代码是:public void setValues(Vector<Vector<String>> v) {
values = v;
fireTableDataChanged();
}
我在这里想念什么吗?
我的DataTableModel的类和方法是(这些方法都实现为返回正确的结果):
public class DataTableModel extends AbstractTableModel {
public DataTableModel(Vector<Vector<String>> v, Vector<String> c) {}
public int getColumnCount() {
if (values != null && values.size() > 0)
return values.elementAt(0).size();
else
return 0;
}
public int getRowCount() {
if (values != null && values.size() > 0)
return values.size();
else
return 0;
}
public Object getValueAt(int arg0, int arg1) {}
public void setValues(Vector<Vector<String>> v) {}
public Vector<Vector<String>> getValues() {}
public void setColumnNames(Vector<String> columns) {}
public String getColumnName(int col) {}
}
最佳答案
您是否为TableModel
实现了其他方法?如果是这样,您的实现看起来如何?也许您应该发布您的表模型代码以供我们检查?
顺便说一句:实现TableModel
时,我的主要错误是将getRowCount()
和getColumnCount()
覆盖为return 0
。这将告诉表没有要显示的数据...
编辑:所以您似乎正在使用类似AbstractTableModel
或DefaultTableModel
的东西,对不对?您是否重写了某些方法?
编辑2:您应该调用fireTableStructureChanged
而不是fireTabeDataChanged()
,因为最初您的表模型正在为0
返回getColumnCount()
。
编辑3:为了进一步优化模型,如果您每次都有具有相同列数的数据,则应考虑为getColumnCount()
返回一个固定值。然后,您可以调用fireTabeDataChanged()
,它仅加载新数据,而不是每次都完全建立表和数据(fireTableStructureChanged()
)。