【问题标题】:JTable Sorting and FilteringJTable 排序和过滤
【发布时间】:2011-11-27 18:46:08
【问题描述】:

我正在创建一个使用两列过滤 JTable 内容的程序。我使用了 RowSorter,一切正常 - 至少根据我所看到的(视图)。

表格上的每一行都可以双击打开一个对话框。此对话框允许您编辑表格上的信息。但是,对话框上的信息仍然是原始视图的信息(使用过滤之前)。

示例:

过滤前表格的第一行是a行。 过滤后表格的第一行是b行。

但是,当我双击打开第一行的对话框时(过滤后,现在应该是 b 行,a 行的对话框打开。) [希望我已经解释得足够清楚]

我认为我的问题是在过滤器发生后模型没有更新。我试过了:

        for(int i = 0; i < table.getRowCount(); i++){
        table.convertRowIndexToView(i);
    }

for(int i = 0; i < table.getRowCount(); i++){
        table.convertRowIndexToModel(i);
    }

当我使用列标题对表格进行排序时,我也遇到了类似的问题。

我该如何解决这个问题?

【问题讨论】:

  • “希望我已经解释得足够好” SSCCE 通常可以很好地解释代码。顺便说一句,您有问题吗?

标签: java swing sorting jtable filtering


【解决方案1】:

我认为我的问题是过滤器发生后模型没有更新

模型永远不会更新。

仅更新视图以按排序/过滤顺序显示模型中的数据。

表格的每一行都可以双击打开一个对话框。

所以我假设您将一行的数据复制到对话框中,以便对其进行编辑,然后将其添加回原始模型。

因此,您需要使用 convertRowIndexToModel(...) 来获取模型行号,以便您可以访问要在编辑对话框中显示的模型数据。您只会对要编辑的行执行此操作,而不是整个表。

【讨论】:

  • 所以 convertRowIndexToModel(...) 会将我选择的行索引转换为模型上的行索引?
  • 感谢@camickr !!!它起作用了:D。这就是我所做的:“int row = myjTable.convertRowIndexToModel(myjTable.rowAtPoint(p));”所以现在我有了我需要的行:))
【解决方案2】:

请参阅有关JTable 的教程,有关于Comparator 的优秀示例以及有关如何使用TableModel 的很好的解释

【讨论】:

    【解决方案3】:

    更改数据后,您可以如下刷新表格;

    for(int i = 0; i < table.getRowCount(); i++)
    {         table.convertRowIndexToModel(i);     } 
    
    table = new jTable(myModel);
    

    myModel.fireTableDataChanged()
    

    希望对你有帮助

    布拉克

    【讨论】:

    • 我认为您已经在 jTable 中添加了行和列,而不是如果您尝试在模型中添加行和列,那么您可以随时通过 .fireTableDataChanged() 或 .fireTableStructureChanged() 更新模型;请检查此示例:java2s.com/Tutorial/Java/0240__Swing/…。如果 table = new jTable(myModel) 不起作用,我不知道如何更新表。
    • 我没有在表格中添加任何行或列。过滤后出现错误的对话框。
    猜你喜欢
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    • 2020-09-23
    • 2020-07-14
    相关资源
    最近更新 更多