2012-11-06 3 views
1

에 나는이 간단한 분류 기능을 썼다 그래서 열이 없습니다.) 자바 필터는 컬럼을 기반으로하지만 표시되지 않은 다른 속성을 기반으로 테이블을 필터링하는 방법은 무엇입니까? 행에 의해 표현 된 기본 객체를 쉽게 가져올 수 있으며 ID를 가져올 수 있지만이를 기반으로 필터링을 수행하려면 어떻게해야합니까? ...JTable의 행 정렬 특성을 기반으로하지 테이블

은 내가 여기 예에서 사용한 필터의 구현입니다 ...
+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; 
     } 

    } 

}