java - 如何在 JTable 中显示/隐藏不同的行部分

标签 java jtable

我有一个 JTable,其中的行列出了目录中的文件和文件夹。文件夹行有一个按钮,可以隐藏和显示列出文件夹中文件的行。当应用程序启动时,文件夹行后面的文件行将被隐藏。在子类方法中创建表后,我使用 RowFilter 最初隐藏这些行:

  ...

  public void createTable(){
      //Create and populate table
      ...
      //Add the filter to initially hide the subfile rows
      TableRowSorter<DefaultTableModel> sorter = new TableRow  Sorter<DefaultTableModel>(tableModel);
      RowFilter hidefilter = getRowFilter();
      sorter.setRowFilter(hidefilter);
      myTable.setRowSorter(sorter);                      
 }  

 ...

 private RowFilter getRowFilter() {
     RowFilter<DefaultTableModel, Integer> filter = new RowFilter<DefaultTableModel, Integer>() {

         @Override
         public boolean include(RowFilter.Entry<? extends DefaultTableModel, ? extends Integer> entry) {
             int modelRow = entry.getIdentifier();

                  if(/* current row column contains a certain flag */){
                    //Hide the row that represents a file in the folder
                    return false;
                }
                else return true;
            }
        };
        return filter;
 } 

此代码成功隐藏了行,但我想知道如何仅显示和重新隐藏一些隐藏行。这可以通过像我已经完成的那样的过滤器类来完成吗?有没有办法通过按钮调用过滤器函数并根据列中找到的值进行过滤?

最佳答案

基本思想是我们需要一个 Filter 类,根据其字段的值过滤条目(我只创建了一个字段以保持示例简单),并且过滤器还具有更改这些字段的值的方法。

然后我们创建一个按钮,在按下时调用此方法,然后调用 table.getRowSorter().allRowsChanged(),这会向表发出数据已更改的信号,因此它已更改重绘自身。

这是一个工作示例。

public class Test {

    public static class Filter extends RowFilter<TableModel, Integer> {
        private String includePrefix = "Foo";

        @Override
        public boolean include(
                javax.swing.RowFilter.Entry<? extends TableModel, ? extends Integer> entry) {
            return entry.getStringValue(0).startsWith( includePrefix );
        }

        // Calling this method changes the filter to allow a different prefix
        public void swapPrefix() {
            this.includePrefix = this.includePrefix.equals("Foo") ? "Bar" : "Foo";
        }
    }

    public static void main(String[] args) {
        //setup
        JFrame frame = new JFrame();
        frame.setLayout( new BoxLayout(frame.getContentPane(), BoxLayout.PAGE_AXIS));
        JTable table = new JTable( new Object[][]{ new Object[]{ "Foo 1" },
                                                   new Object[]{ "Bar 1" },
                                                   new Object[]{ "Foo 2" },
                                                   new Object[]{ "Foo 3" },
                                                   new Object[]{ "Bar 2" }},

                                   new Object[] { "Foo"});

        //create and configure sorter
        Filter filter = new Filter();
        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(table.getModel());
        sorter.setRowFilter(filter);
        table.setRowSorter(sorter);

        JButton changeFilter = new JButton( "Change filter");
        // pressing the button changes the filter first, then tells the table sorter to update the display
        changeFilter.addActionListener( e -> { filter.swapPrefix(); table.getRowSorter().allRowsChanged(); });

        //display window
        frame.add( table );
        frame.add(changeFilter);
        frame.pack();
        frame.setVisible( true );
    }
}

关于java - 如何在 JTable 中显示/隐藏不同的行部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31886010/

相关文章:

java - 无法安装 Java JDK 8

java - Java 中的约瑟夫斯游戏

java - 如果使用 java 满足特定条件,如何将颜色设置为特定行?

java - JTable 滚动到指定的行索引

java - 当我删除 JTable 行时,为什么会收到 ArrayIndexOutOfBoundsException?

java - ArrayLists重复元素合并

java - Swing:如何将自定义光标设置为透明?

Java 线程 - 需要注意的事项?

java - JTable 上的自定义单元格返回错误值(并且无法正确显示)

java - 如何使用单个删除按钮从不同的 JTable 中删除行