1

我有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) {}
}
4

3 回答 3

1

您是否实施了其他方法TableModel?如果是这样,您的实现看起来如何?也许您应该发布您的表格模型代码让我们检查它?

顺便说一句:我在实施时的主要错误是TableModel覆盖getRowCount()和. 这将告诉表格没有要显示的数据...getColumnCount()return 0

编辑:所以你似乎在使用类似 anAbstractTableModel或 a 的东西DefaultTableModel,对吧?您是否覆盖了某些方法?

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

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

于 2008-12-16T06:09:54.217 回答
0

这是个奇怪的问题。你说的DataTableModel实现TableModel。所以。如果您不使用抽象类,问题应该出在您处理事件的方式上。听众真的注册然后通知了吗?如果可以的话,请发链接到源代码DataTableModel。但在此之前,请验证您是否正确处理注册到此模型中的侦听器。

于 2008-12-16T08:28:04.483 回答
-1

这解决了问题;您不允许取消绑定主 bindingGroup,但您指定 jtablebinding 像这样更新它

Binding b = bindingGroup.getBindings().get(0);
b.unbind();
b.bind();
于 2015-04-08T00:16:13.837 回答