jTable行数VS模型行数

时间:2014-05-13 09:04:40

标签: java swing jdbc jtable defaulttablemodel

我有一个jTable从数据库查询中加载数据 此加载产生32个结果,因此TableModel中有32行 使用myTable.getRowCount()我正确得到32

然后我创建一个新的空模型并将其加载到表中 在那之后,如果我打电话给myTable.getRowCount()我仍然会得到32 但如果我调用myModel.getRowCount()我正确得到0!

如果我的表使用模型,为什么table.getRowCount()和model.getRowCount()之间应该有区别?

...
System.out.println(myTable.getRowCount());  // 32


String[] columnNames= {null};
DefaultTableModel emptyModel= new DefaultTableModel(null, columnNames);
emptyModel.setRowCount(0);
myTable.setModel(emptyModel);

System.out.println(myTable.getRowCount());  // still 32, expecting 0
System.out.println(emptyModel.getRowCount());  // 0 as expected

2 个答案:

答案 0 :(得分:1)

你能发布一份可验证的你的代码吗?因为我尝试使用以下代码并且模型更改没有任何问题。

  public static void main(String[] args) throws InterruptedException {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        DefaultTableModel model = new DefaultTableModel(
                new Object[][] { { "some", "text" }, { "any", "text" },
                        { "even", "more" }, { "text", "strings" },
                        { "and", "other" }, { "text", "values" } },
                new Object[] { "Column 1", "Column 2" });
        String[] columnNames= {null};
        DefaultTableModel model1 = new DefaultTableModel(null,columnNames);
        model1.setRowCount(0);


        JTable table = new JTable(model);
        JScrollPane scrollPane = new JScrollPane(table);
        frame.add(scrollPane, BorderLayout.CENTER);
        frame.setSize(300, 150);
        frame.setVisible(true);
        Thread.sleep(5000);
        table.setModel(model1);
    }

答案 1 :(得分:0)

使用自定义RowSorter(或任何RowSorter)时,必须注意确保分拣机和表的模型始终匹配。正如setRowSorter Javadoc中指定的那样:

  

如果RowSorter的基础模型与此JTable的基础模型不同,将导致未定义的行为。

JTable的setModel方法不会更新行分类器,除非您使用默认的自动分类器(通过设置autoCreateRowSorter标志)。

因此,你应该

  • 保留对您的分拣机的参考并更新其型号
  • 通过在桌面上设置setAutoCreateRowSorter(true)而不是自定义排序器来使用默认行排序器,