我有一个名为JTable的自定义TableModelDataTableModel。我用一组列名和没有数据的表来初始化表,如下所示:

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。这将告诉表没有要显示的数据...

编辑:所以您似乎正在使用类似AbstractTableModelDefaultTableModel的东西,对不对?您是否重写了某些方法?

编辑2:您应该调用fireTableStructureChanged而不是fireTabeDataChanged(),因为最初您的表模型正在为0返回getColumnCount()

编辑3:为了进一步优化模型,如果您每次都有具有相同列数的数据,则应考虑为getColumnCount()返回一个固定值。然后,您可以调用fireTabeDataChanged(),它仅加载新数据,而不是每次都完全建立表和数据(fireTableStructureChanged())。

07-27 18:00