JTable更新没有出现

时间:2008-12-16 03:17:41

标签: java user-interface swing jtable

我有一个名为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) {}
}

3 个答案:

答案 0 :(得分:1)

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

BTW:实施TableModel时出现的主要错误是覆盖getRowCount()getColumnCount()return 0。这将告诉表格没有要显示的数据......

编辑:所以你似乎在使用AbstractTableModelDefaultTableModel之类的东西,对吧?你有没有覆盖一些方法?

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

Binding b = bindingGroup.getBindings().get(0);
b.unbind();
b.bind();