如何使用RowSorter的JTable中
答
而不是使用额外的组合框进行搜索的,尝试使用SwingBits库为您的代码。
你可以找到的jar文件Here。
之后,该行的代码添加到您的源代码在你的JTable中显示所有数据后:
TableRowFilterSupport.forTable(jTable1).searchable(true).apply();
之后,你就可以进行排序,并使用留在运行时过滤数据,然后右键点击分别鼠标。
答
这是例如具有定制的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;
}
}
使用自定义的TableModel有两个列表。在第一次保存所有的数据,仅次于数据表显示(发现结果)。 –