按列过滤JTable而不是Java中的行

时间:2012-10-09 08:41:39

标签: java jtable jtextfield rowfilter tablecolumn

在Java中是否有任何实现来过滤JTable(使用搜索JTextField)的列(标题值)而不是其行?我需要根据搜索时找到的字符串显示/隐藏列。

3 个答案:

答案 0 :(得分:1)

  

在Java中是否有任何实现来过滤JTable(使用搜索JTextField)的列(标题值)而不是其行?

  • 是的,请查看RowFilter并申请所需的列
  

我需要根据搜索时找到的字符串显示/隐藏列。

  • 这不是一件容易的事,因为它需要付出很多努力,并且对Java Essential classesSwingJTable

    的专家有很好的了解LI>
  • 我不会这样做,使用正确的ColumnRender,然后应该突出显示列,而不是跳跃(隐藏 - > show ---> hide等){{ 1}}在屏幕上

  • 有一些关于JTables ColumnRowFilter的例子,从未尝试过,从未尝试过。

答案 1 :(得分:0)

您可以使用自定义TableModel实现来包装您的真实模型以进行过滤。只要列发生变化,就继续通知TableModelListeners。

答案 2 :(得分:0)

我想我的工作是这样的:

为临时表和表模型声明一些全局变量以保存隐藏列:

private JTable hiddenTable = new JTable();
private DefaultTableColumnModel hiddenModel = new DefaultTableColumnModel();

然后对每个按下的键使用过滤方法,将列添加到临时表模型中,同时从主表模型中删除它们。然后,在字符串匹配时再次显示它们,方法是将它们添加回主表,然后将它们从临时表中删除:

private void filterList() {

        // Hide columns
        for (TableColumn column : table.getColumns()) {
            if (!((String) column.getHeaderValue()).toLowerCase().contains(
                    searchBox.getText().toLowerCase().trim())) {
                hiddenModel.addColumn(column);
                table.getColumnModel().removeColumn(column);
            }
        }

        // Show columns
        for (TableColumn column : hiddenTable.getColumns()) {
            if (((String) column.getHeaderValue()).toLowerCase().contains(
                    searchBox.getText().toLowerCase().trim())) {
                table.getColumnModel().addColumn(column);
                hiddenModel.removeColumn(column);
            }
        }
    }

这里唯一的问题是,当列重新添加到表中时,列会丢失它们的顺序。