2012-11-06 38 views
1

我写了这个简单的排序功能:JTable的排序行没有在表

public void applyFilter(String filter, int col) 
{ 
    if(filter.length() == 0) 
     sorter.setRowFilter(null); 

    RowFilter<Object, Object> rf = null; 
    try 
    { 
     rf = RowFilter.regexFilter(filter, col); 
    } 
    catch (java.util.regex.PatternSyntaxException e) 
    { 
     return; 
    } 

    sorter.setRowFilter(rf); 
    refreshTable(); 
} 

但后来我意识到,我想筛选基于一个ID,我还没有表现出对视图表(所以它没有列)。 java过滤器基于列,但是如何根据其他未显示的属性过滤表?我可以轻松地获取该行代表的底层对象并获取该ID,但是我该如何根据该过滤器进行过滤?

+0

有关隐藏列是什么?您仍然可以对其进行排序,但它不会在表格中显示。 –

+0

这正是我所诉诸的。我把该列的混合和最大宽度设置为0.事情正在起作用,我只是在寻找更清洁的解决方案。 –

+0

隐藏列是通过调用'JTable#removeColumn'来完成的,它从视图中删除它,而不是模型。优于将宽度设置为0 – Robin

回答

4

这将取决于您的数据建模方式很多,但基本上你可以编写自己的过滤器...

这是过滤器实现我在我的例子中使用...

public class IDFilter extends RowFilter<MyModel, Integer> { 

     private int id; 

     public IDFilter(int id) { 
      this.id = id; 
     } 

     public boolean include(RowFilter.Entry<? extends MyModel, ? extends Integer> entry) { 
      MyModel personModel = entry.getModel(); 
      RowValue value = personModel.getValueAt(entry.getIdentifier()); 
      if (value.getId() == id) { 
       return true; 
      } 
      return false; 
     } 

    } 

这里运行它的一个例子...

public class TestTableFilter { 

    public static void main(String[] args) { 
     new TestTableFilter(); 
    } 

    public TestTableFilter() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException ex) { 
       } catch (InstantiationException ex) { 
       } catch (IllegalAccessException ex) { 
       } catch (UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new FilterPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 

     }); 
    } 

    public class FilterPane extends JPanel { 

     private JTable table; 
     private int filter; 
     private TableRowSorter<MyModel> sorter; 

     public FilterPane() { 
      setLayout(new BorderLayout()); 
      MyModel model = new MyModel(); 
      sorter = new TableRowSorter<MyModel>(model); 
      table = new JTable(model); 
      table.setRowSorter(sorter); 
      add(new JScrollPane(table)); 

      JButton filterButton = new JButton("Filter"); 
      filterButton.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        filter++; 
        System.out.println(filter); 
        RowFilter<MyModel, Integer> rowFilter = null; 
        switch (filter) { 
         case 1: 
          rowFilter = new IDFilter(0); 
          break; 
         case 2: 
          rowFilter = new IDFilter(1); 
          break; 
         default: 
          filter = 0; 
        } 
        sorter.setRowFilter(rowFilter); 
       } 
      }); 
      add(filterButton, BorderLayout.SOUTH); 
     } 

    } 

    public class MyModel extends AbstractTableModel { 

     private List<RowValue> values; 

     public MyModel() { 
      values = new ArrayList<>(25); 
      for (int index = 0; index < 10; index++) { 
       values.add(new RowValue(index % 2, Character.toString((char) (65 + index)), index)); 
      } 
     } 

     @Override 
     public int getRowCount() { 
      return values.size(); 
     } 

     @Override 
     public int getColumnCount() { 
      return 2; 
     } 

     @Override 
     public Object getValueAt(int rowIndex, int columnIndex) { 
      RowValue row = values.get(rowIndex); 
      Object value = null; 
      switch (columnIndex) { 
       case 0: 
        value = row.getName(); 
        break; 
       case 1: 
        value = row.getValue(); 
        break; 
      } 
      return value; 
     } 

     public RowValue getValueAt(int row) { 
      return values.get(row); 
     } 

    } 

    public class RowValue { 

     private int id; 
     private String name; 
     private int value; 

     public RowValue(int id, String name, int value) { 
      this.id = id; 
      this.name = name; 
      this.value = value; 
     } 

     public int getId() { 
      return id; 
     } 

     public String getName() { 
      return name; 
     } 

     public int getValue() { 
      return value; 
     } 

    } 

    public class IDFilter extends RowFilter<MyModel, Integer> { 

     private int id; 

     public IDFilter(int id) { 
      this.id = id; 
     } 

     public boolean include(RowFilter.Entry<? extends MyModel, ? extends Integer> entry) { 
      MyModel personModel = entry.getModel(); 
      RowValue value = personModel.getValueAt(entry.getIdentifier()); 
      if (value.getId() == id) { 
       return true; 
      } 
      return false; 
     } 

    } 

}