//Registration filter
final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(databaseModel);
DocumentListener idListener = new DocumentListener() {
public void changedUpdate(DocumentEvent documentEvent) {
}
public void insertUpdate(DocumentEvent documentEvent) {
String searchText = txtReg.getText();
if (searchText.length() == 0) {
sorter.setRowFilter(null);
} else {
sorter.setRowFilter(RowFilter.regexFilter(searchText));
}
numberOfRecords.setText(searchTable.getRowCount() + " records");
}
public void removeUpdate(DocumentEvent documentEvent) {
}
};
txtReg.getDocument().addDocumentListener(idListener);
我又来了,这可能是一些愚蠢的问题... :(我有一个JTable,我想在文本字段输入时过滤掉。经过研究,我想出了这个,但它不起作用!如果我把过滤器放在监听器之外,用任意字符串作为搜索词,它就能很好地工作。我错过了什么?谢谢!
public class GUI extends JFrame {
private static final long serialVersionUID = -7968397937566078184L;
private static final JLabel numberOfRecords = new JLabel();
private static int numberOfRows;
private static DefaultTableModel databaseModel;
public GUI(DefaultTableModel database){
setDefaultLookAndFeelDecorated(true);
setLayout(new MigLayout());
databaseModel = database;
//Menus
JMenuBar menubar = new JMenuBar();
JMenu file = new JMenu("File");
JMenuItem update = new JMenuItem("Look for database updates");
JMenuItem settings = new JMenuItem("Settings");
JMenuItem exit = new JMenuItem("Exit");
menubar.add(file);
file.add(update);
file.add(settings);
file.add(exit);
setJMenuBar(menubar);
//Top section
JPanel searchSection = new JPanel();
searchSection.setLayout(new MigLayout("w 50mm!"));
final JTextField txtReg = new JTextField(10);
JLabel searchID = new JLabel("Current registration:");
JLabel lblManufacturer = new JLabel("Manufacturer");
JComboBox cmbManufacturer = new JComboBox();
JLabel lblType = new JLabel("Type");
JComboBox cmbType = new JComboBox();
//Build main window
searchSection.add(searchID);
searchSection.add(txtReg, "span 2");
searchSection.add(lblManufacturer);
searchSection.add(cmbManufacturer, "growx, span 2");
searchSection.add(lblType);
searchSection.add(cmbType,"growx, span 2");
//Table
final JTable searchTable = new JTable(databaseModel);
//Pack table, still have to figure this one out
int width = 0;
for (int row = 0; row < searchTable.getRowCount(); row++) {
TableCellRenderer renderer = searchTable.getCellRenderer(row, 2);
Component comp = searchTable.prepareRenderer(renderer, row, 2);
width = Math.max (comp.getPreferredSize().width, width);
}
searchTable.getColumn("Key").setMaxWidth(0);
searchTable.getColumn("Key").setMinWidth(0);
searchTable.setRowSelectionAllowed(true);
searchTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
searchTable.setAutoCreateRowSorter(true);
searchTable.getRowSorter().toggleSortOrder(1);
searchTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
numberOfRows=searchTable.getRowCount();
JScrollPane browserSP = new JScrollPane(searchTable);
browserSP.setBorder(BorderFactory.createEmptyBorder(0, 4, 4, 4));
setTitle("AirBase");
setSize(1300,700);
setMinimumSize(new Dimension(1250,650));
setExtendedState(JFrame.MAXIMIZED_BOTH);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
//TODO Fill manufacturer box
//Registration filter
//TODO Fix this!
final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(databaseModel);
DocumentListener idListener = new DocumentListener() {
public void changedUpdate(DocumentEvent documentEvent) {
}
public void insertUpdate(DocumentEvent documentEvent) {
String searchText = txtReg.getText();
if (searchText.length() == 0) {
sorter.setRowFilter(null);
} else {
sorter.setRowFilter(RowFilter.regexFilter(searchText));
}
numberOfRecords.setText(searchTable.getRowCount() + " records");
}
public void removeUpdate(DocumentEvent documentEvent) {
}
};
txtReg.getDocument().addDocumentListener(idListener);
add(searchSection, "w 100%, h 5%, wrap");
add(browserSP,"w 100%, h 95%, wrap");
numberOfRecords.setFont(numberOfRecords.getFont().deriveFont(9.0f));
numberOfRecords.setText(numberOfRows + " RECORDS");
add(numberOfRecords, "alignx center");
}
}
答案 0 :(得分:3)
所以我最终开始了。看起来像一个简单的错误。你忘记了表的setRowSorter
。
searchTable.setRowSorter(sorter);
添加了适用于我的代码。应该为你工作两个,给你一个有效的TableModel
传递给GUI
。我刚刚组成了一个假人。
注意:
您可能还希望将过滤器代码添加到removeUpdate
,在DocumentListener
中,因此当文本退格时,它仍会过滤
此searchTable.getColumn("Key").setMaxWidth(0);
使行数据不可见。那是你真正想要的吗?
如果您希望过滤器在没有区分大小写的情况下进行过滤,则可以使用此
sorter.setRowFilter(RowFilter.regexFilter("(?i)" + searchText));
"(?i)"
是案例性的正则表达式“flag”