【问题标题】:JTable updates not appearingJTable 更新未出现
【发布时间】:2008-12-16 03:17:40
【问题描述】:

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

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&lt;Vector&lt;String&gt;&gt;。但是,尽管所有这些代码都在执行,但它并没有显示在屏幕上。 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) {}
}

【问题讨论】:

  • mhhh nope.. 我认为你的模型和你的桌子没有连接。你能发布你的实际代码吗?
  • 设置模型应该足够了。 .您自己编写了 DataTableModel 代码吗?
  • 是的,我做到了。当我检查 DataTableModel 时,它似乎有正确的数据。

标签: java user-interface swing jtable


【解决方案1】:

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

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

编辑:所以你似乎在使用AbstractTableModel 或DefaultTableModel 之类的东西,对吧?你重写了一些方法吗?

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我已经调试了代码。更新代码确实被调用了,updateValues() 方法也是如此。所以fireTableDataChanged()方法也被调用了,没有报错,但是显示没有变化。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多