2017-10-07 84 views
0

當我選擇從ComboBox類和第那麼它將不得不尋找JTable的特定類和部分搜索兩個值,並只顯示那些類和部分?
如何使用RowSorter的JTable中

enter image description here

+0

使用自定義的TableModel有兩個列表。在第一次保存所有的數據,僅次於數據表顯示(發現結果)。 –

回答

0

而不是使用額外的組合框進行搜索的,嘗試使用SwingBits庫爲您的代碼。

你可以找到的jar文件Here

之後,該行的代碼添加到您的源代碼在你的JTable中顯示所有數據後:

TableRowFilterSupport.forTable(jTable1).searchable(true).apply(); 

之後,你就可以進行排序,並使用留在運行時過濾數據,然後右鍵點擊分別鼠標。

0

這是例如具有定製的TableModel

StudentTableModel.java

public class StudentTableModel extends AbstractTableModel implements TableModel { 
    private List<Student> data; 
    private List<Student> filtredList; 

    private Predicate<Student> predicate = student -> true; 

    public List<Student> getData() { 
     return data; 
    } 

    public void setData(List<Student> data) { 
     this.data = data; 
     filter(predicate); 
    } 

    public void filter(Predicate<Student> predicate) { 
     this.predicate = predicate; 

     filtredList = data.stream() 
       .filter(predicate) 
       .collect(Collectors.toList()); 

     fireTableDataChanged(); 
    } 

    @Override 
    public String getColumnName(int column) { 
     return "Title " + (column + 1); 
    } 

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

    @Override 
    public int getRowCount() { 
     if(filtredList == null) { 
      return 0; 
     } 

     return filtredList.size(); 
    } 

    @Override 
    public Object getValueAt(int rowIndex, int columnIndex) { 
     Student student = filtredList.get(rowIndex); 
     switch (columnIndex) { 
      case 0: return rowIndex + 1; 
      case 1: return student.getName(); 
      case 2: return student.getClassName(); 
      case 3: return student.getSectionName(); 

      default: return "N/A"; 
     } 
    } 
} 

MainFrame.java

public class MainFrame extends JFrame { 

    private JTextField textField; 
    private JComboBox<String> classComboBox, sectionComboBox; 
    private JTable table; 

    public MainFrame(String title) { 
     super(title); 
     creageGUI(); 
    } 

    private void creageGUI() { 
     List<Student> list = new ArrayList<>(); 
     list.add(new Student("Name 1", "Class B", "1")); 
     list.add(new Student("Name 2", "Class A", "1")); 
     list.add(new Student("Name 3", "Class B", "3")); 
     list.add(new Student("Name 4", "Class A", "1")); 
     list.add(new Student("Name 5", "Class A", "2")); 
     list.add(new Student("Name 6", "Class C", "1")); 
     list.add(new Student("Name 7", "Class A", "3")); 
     list.add(new Student("Name 8", "Class B", "4")); 
     list.add(new Student("Name 9", "Class A", "1")); 
     list.add(new Student("Name 10", "Class C", "2")); 
     list.add(new Student("Name 11", "Class B", "1")); 
     list.add(new Student("Name 12", "Class C", "1")); 

     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     setLayout(new BorderLayout(0, 5)); 
     setMinimumSize(new Dimension(600, 480)); 

     textField = new JTextField(20); 
     textField.getDocument().addDocumentListener(new DocumentListener() { 
      @Override 
      public void insertUpdate(DocumentEvent e) { 
       actionListener(null); 
      } 

      @Override 
      public void removeUpdate(DocumentEvent e) { 
       actionListener(null); 
      } 

      @Override 
      public void changedUpdate(DocumentEvent e) { 
       actionListener(null); 
      } 
     }); 

     JPanel searchPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 0)); 
     searchPanel.add(new JLabel("Search")); 
     searchPanel.add(textField); 

     classComboBox = new JComboBox<>(new String[]{"Class A", "Class B", "Class C"}); 
     classComboBox.setSelectedIndex(-1); 
     classComboBox.addActionListener(this::actionListener); 

     sectionComboBox = new JComboBox<>(new String[] {"1", "2", "3", "4", "5"}); 
     sectionComboBox.setSelectedIndex(-1); 
     sectionComboBox.addActionListener(this::actionListener); 

     JPanel comboBoxPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 0)); 
     comboBoxPanel.add(new JLabel("Class")); 
     comboBoxPanel.add(classComboBox); 
     comboBoxPanel.add(Box.createHorizontalStrut(20)); 
     comboBoxPanel.add(new JLabel("Section")); 
     comboBoxPanel.add(sectionComboBox); 

     JPanel headerPanel = new JPanel(); 
     headerPanel.setLayout(new BoxLayout(headerPanel, BoxLayout.PAGE_AXIS)); 
     headerPanel.add(searchPanel); 
     headerPanel.add(Box.createVerticalStrut(5)); 
     headerPanel.add(comboBoxPanel); 

     StudentTableModel model = new StudentTableModel(); 
     model.setData(list); 

     table = new JTable(model); 
     JScrollPane scrollPane = new JScrollPane(table); 

     JButton clearFilterButton = new JButton("Clear"); 
     clearFilterButton.addActionListener(event -> { 
      textField.setText(""); 
      classComboBox.setSelectedIndex(-1); 
      sectionComboBox.setSelectedIndex(-1); 
     }); 

     JPanel bottomPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); 
     bottomPanel.add(clearFilterButton); 

     add(headerPanel, BorderLayout.PAGE_START); 
     add(scrollPane, BorderLayout.CENTER); 
     add(bottomPanel, BorderLayout.PAGE_END); 
    } 

    private void actionListener(ActionEvent event) { 
     StudentTableModel model = (StudentTableModel) table.getModel(); 
     model.filter(student -> { 
      String name = textField.getText(); 
      String className = (String) classComboBox.getSelectedItem(); 
      String sectionName = (String) sectionComboBox.getSelectedItem(); 

      if(!name.isEmpty() && !student.getName().contains(name)) { 
       return false; 
      } 

      if(className != null && !student.getClassName().equals(className)) { 
       return false; 
      } 

      if(sectionName != null && !student.getSectionName().equals(sectionName)) { 
       return false; 
      } 

      return true; 
     }); 
    } 
} 

Student.java

public class Student { 
    private String name; 
    private String className; 
    private String sectionName; 

    public Student() { 
    } 

    public Student(String name, String className, String sectionName) { 
     this.name = name; 
     this.className = className; 
     this.sectionName = sectionName; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getClassName() { 
     return className; 
    } 

    public void setClassName(String className) { 
     this.className = className; 
    } 

    public String getSectionName() { 
     return sectionName; 
    } 

    public void setSectionName(String sectionName) { 
     this.sectionName = sectionName; 
    } 
}