0
A
回答
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;
}
}
相關問題
- 1. JTable中,RowSorter的,getSelectedRow數據
- 2. 如何使用RowHeader處理JTable中的RowSorter同步?
- 3. 禁用的JTable RowSorter的用於HeaderView
- 4. 如何使用JTable中
- 5. 如何ResultSet的數據添加到JTable中使用的JTable
- 6. 如何在JTable中使用監聽器?
- 7. 我如何使用StringTokenizer與我的jTable
- 8. 如何使用JTable中Resultset的使用數據?
- 9. 未在渲染器中設置RowSorter
- 10. JTable中不使用的DefaultTableModel
- 11. JTable中使用mouselisteners的
- 12. 如何在JTable中
- 13. 如何從JTable中
- 14. 如何在JTable中
- 15. 如何從JTable中
- 16. 如何在JTable中
- 17. 如何JTable中排
- 18. JTable中如何實現用的TableCellRenderer
- 19. 爪哇fireTableRowsInserted(INT,INT)與RowSorter的
- 20. Java Swing:如何使用JTable工作?
- 21. 如何使用哈希映射與JTable
- 22. 如何使用rs2xml jar庫填充Jtable
- 23. 如何使用jtextfield值彈出jtable
- 24. 如何使用jTable實現Lucene TableSearch
- 25. 如何使jList在jTable中可選擇
- 26. 如何使用JTable中的glazedlist的UndoRedoSupport或undoSupport?
- 27. 填充JTable中使用MySQL
- 28. 多JTable中使用Miglayout
- 29. 在IntelliJ IDEA中使用JTable
- 30. 在netbeans中使用JTable
使用自定義的TableModel有兩個列表。在第一次保存所有的數據,僅次於數據表顯示(發現結果)。 –