我有一个JTable(DefaultTableModel)和一个JTextField。我想用我放入文本字段的正则表达式过滤JTable。当我启动程序时,会显示所有条目,但是当我在文本字段中输入文本时,即使它应该在一行中找到文本,也不会显示任何行。
private void createFilter() {
_sorter = new TableRowSorter<DefaultTableModel>(new DefaultTableModel());
JPanel filterPanel = new JPanel();
filterPanel.setLayout(new BorderLayout());
JLabel filterLabel = new JLabel("Filter:");
filterPanel.add(filterLabel, BorderLayout.WEST);
_inputField = new JTextField();
_inputField.setColumns(40);
filterPanel.add(_inputField, BorderLayout.CENTER);
_inputField.getDocument().addDocumentListener(new DocumentListener() {
public void insertUpdate(DocumentEvent de) {
newFilter();
}
public void removeUpdate(DocumentEvent de) {
newFilter();
}
public void changedUpdate(DocumentEvent de) {
newFilter();
}
});
JButton clearButton = new JButton("X");
clearButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
_inputField.setText("");
}
});
filterPanel.add(clearButton, BorderLayout.EAST);
_mainFrame.add(filterPanel, BorderLayout.SOUTH);
}
private void newFilter() {
RowFilter<DefaultTableModel, Object> rowFilter = null;
try {
rowFilter = RowFilter.regexFilter(_inputField.getText());
}
catch(java.util.regex.PatternSyntaxException ex) {
return;
}
_sorter.setRowFilter(rowFilter);
_table.setRowSorter(_sorter);
}
我的调试器告诉我,rowFilter已初始化,因此不能因为RegEx错误。每次按键时都会调用newFilter()。
提前致谢。如果需要,我很乐意提供更多信息。
此致 迈克尔
答案 0 :(得分:5)
似乎JTable和TableRowSorter都有不同的表模型。应使用JTable的表模型构造TableRowSorter。
答案 1 :(得分:1)
JTable教程包含JTable Filtering and Sorting的示例,另一个示例here,
对于Case Insensitive,你必须设置
TableRowSorter<TableModel>#setRowFilter(
RowFilter.regexFilter("(?i)" + myTextField.getText()));
编辑:
基本解决方法:
final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(tableFxModel);
myTable.setRowSorter(sorter);
filterFxText.getDocument().addDocumentListener(new DocumentListener() {
private void searchFieldChangedUpdate(DocumentEvent evt) {
String text = filterFxText.getText();
if (text.length() == 0) {
sorter.setRowFilter(null);
} else {
try {
sorter.setRowFilter(RowFilter.regexFilter("(?i)" + text));
} catch (PatternSyntaxException pse) {
JOptionPane.showMessageDialog(null, "Bad regex pattern",
"Bad regex pattern", JOptionPane.ERROR_MESSAGE);
}
}
}
@Override
public void insertUpdate(DocumentEvent evt) {
searchFieldChangedUpdate(evt);
}
@Override
public void removeUpdate(DocumentEvent evt) {
searchFieldChangedUpdate(evt);
}
@Override
public void changedUpdate(DocumentEvent evt) {
searchFieldChangedUpdate(evt);
}
});
答案 2 :(得分:1)
首先,更容易在此块上打印堆栈跟踪而不是调试,以便能够在初始化RowFilter期间知道是否存在错误。
catch(java.util.regex.PatternSyntaxException ex) {
ex.printStackTrace();
return;
}
我找不到代码有什么问题,似乎问题在于正则表达式。因此,如果您可以针对您希望显示的行之一来测试键入JTextField的正则表达式,以查看它是否匹配: Javascript Regular Expression Validator