我需要通过特定列的值动态过滤我的JTable。所以,如果我有2列,例如" Country"和" Capital",我想只按列Country过滤。 我通过实现此代码找到了问题的部分解决方案:
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.RowFilter;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
public class TestTableSortFilter extends JPanel {
private String[] columnNames
= {"Country", "Capital", "Population in Millions", "Democracy"};
private Object[][] data = {
{"USA", "Washington DC", 280, true},
{"Canada", "Ottawa", 32, true},
{"United Kingdom", "London", 60, true},
{"Germany", "Berlin", 83, true},
{"France", "Paris", 60, true},
{"Norway", "Oslo", 4.5, true},
{"India", "New Delhi", 1046, true}
};
private DefaultTableModel model = new DefaultTableModel(data, columnNames);
private JTable jTable = new JTable(model);
private TableRowSorter<TableModel> rowSorter
= new TableRowSorter<>(jTable.getModel());
private JTextField jtfFilter = new JTextField();
private JButton jbtFilter = new JButton("Filter");
public TestTableSortFilter() {
jTable.setRowSorter(rowSorter);
JPanel panel = new JPanel(new BorderLayout());
panel.add(new JLabel("Specify a word to match:"),
BorderLayout.WEST);
panel.add(jtfFilter, BorderLayout.CENTER);
setLayout(new BorderLayout());
add(panel, BorderLayout.SOUTH);
add(new JScrollPane(jTable), BorderLayout.CENTER);
jtfFilter.getDocument().addDocumentListener(new DocumentListener(){
@Override
public void insertUpdate(DocumentEvent e) {
String text = jtfFilter.getText();
if (text.trim().length() == 0) {
rowSorter.setRowFilter(null);
} else {
rowSorter.setRowFilter(RowFilter.regexFilter("(?i)" + text));
}
}
@Override
public void removeUpdate(DocumentEvent e) {
String text = jtfFilter.getText();
if (text.trim().length() == 0) {
rowSorter.setRowFilter(null);
} else {
rowSorter.setRowFilter(RowFilter.regexFilter("(?i)" + text));
}
}
@Override
public void changedUpdate(DocumentEvent e) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
});
}
问题是,当我过滤表格时,它会按所有列过滤它,而不是特定列。 感谢您的帮助。
答案 0 :(得分:4)
阅读Sorting and Filtering上Swing教程中的部分,了解对单个列进行过滤的工作示例。
关键是在创建正则表达式过滤器时指定列。您还可以查看RowFilter.regexFilter(...)
参数的API。
答案 1 :(得分:0)
下面的静态方法将动态过滤表行。只需传递3个参数即可。
1.JTable tbl>排序表
2. JTextField txtSearch>用于搜索的textField
3.整数SearchColumnIndex>您要搜索的列
public static void AddFilter(JTable tbl, JTextField txtSearch, Integer SearchColumnIndex) {
DefaultTableModel model = (DefaultTableModel) tbl.getModel();
final TableRowSorter< DefaultTableModel> sorter = new TableRowSorter< DefaultTableModel>(model);
tbl.setRowSorter(sorter);
txtSearch.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void changedUpdate(DocumentEvent e) {
OnChange();
}
@Override
public void removeUpdate(DocumentEvent e) {
OnChange();
}
@Override
public void insertUpdate(DocumentEvent e) {
OnChange();
}
public void OnChange() {
var txt = txtSearch.getText().toLowerCase();
if (txt.length() == 0) {
sorter.setRowFilter(null);
} else {
try {
sorter.setRowFilter(RowFilter.regexFilter("^(?i)" + txt, SearchColumnIndex));
} catch (PatternSyntaxException pse) {
System.out.println("Bad regex pattern");
}
}
}
});
}