2012-11-06 39 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; 
     } 

    } 

}