代码之家  ›  专栏  ›  技术社区  ›  Elie

jtable更新未出现

  •  1
  • Elie  · 技术社区  · 17 年前

    我有一个 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);
    

    书单在哪里 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 回复  |  直到 9 年前
        1
  •  1
  •   Lahiru Ashan Gio    9 年前

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

    btw:实现时的主要错误 桌面模型 是超越 getRowCount() getColumnCount() return 0 . 这将告诉表没有要显示的数据…

    编辑:所以你似乎在使用 AbstractTableModel 或A DefaultTableModel 对吧?您重写了一些方法吗?

    编辑2:你应该打电话 fireTableStructureChanged 而不是 fireTabeDataChanged() ,因为最初您的表模型正在返回 0 对于 获取列计数() .

    编辑3:要进一步优化模型,应考虑返回 获取列计数() 如果每次都有相同列数的数据。然后你可以打电话给 FireTabedAttachanged()。 它只是加载新数据,而不是完全构建表和数据( fireTableStructureChanged() 每次。

        2
  •  0
  •   Rastislav Komara    17 年前

    这是个奇怪的问题。你说过 DataTableModel 器具 TableModel . 所以。如果不使用抽象类,那么问题应该在处理事件的方式上。侦听器是否已注册,然后得到通知?如果可以,请将链接发送到 数据结构模型 . 但在之前,请验证您是否正确地处理了注册到此模型中的侦听器。

        3
  •  0
  •   Hatem Badawi    10 年前

    这就解决了这个问题;不允许解除绑定主绑定组,但可以指定jtablebinding来像这样更新它。

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