Java 使用JTextField的JTable过滤不';行不通
我有一个JTable(DefaultTableModel)和一个JTextField。我想用我放在文本字段中的正则表达式过滤JTable。当我启动程序时,会显示所有条目,但当我在文本字段中输入文本时,不会显示任何行,即使它应该在一行中找到文本Java 使用JTextField的JTable过滤不';行不通,java,swing,jtable,filtering,Java,Swing,Jtable,Filtering,我有一个JTable(DefaultTableModel)和一个JTextField。我想用我放在文本字段中的正则表达式过滤JTable。当我启动程序时,会显示所有条目,但当我在文本字段中输入文本时,不会显示任何行,即使它应该在一行中找到文本 private void createFilter() { _sorter = new TableRowSorter<DefaultTableModel>(new DefaultTableModel()); JPanel fi
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);
}
private void createFilter(){
_sorter=新表格行sorter(新的DefaultTableModel());
JPanel filterPanel=新的JPanel();
setLayout(新的BorderLayout());
JLabel filterLabel=新的JLabel(“过滤器:”);
添加(filterLabel,BorderLayout.WEST);
_inputField=新的JTextField();
_inputField.setColumns(40);
filterPanel.add(_inputField,BorderLayout.CENTER);
_inputField.getDocument().addDocumentListener(新DocumentListener()){
公共作废插入更新(DocumentEvent de){
newFilter();
}
公共作废移除更新(DocumentEvent de){
newFilter();
}
公共作废更改日期(DocumentEvent de){
newFilter();
}
});
JButton clearButton=新JButton(“X”);
clearButton.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
_inputField.setText(“”);
}
});
添加(clearButton,BorderLayout.EAST);
_mainFrame.add(filterPanel,BorderLayout.SOUTH);
}
私有void newFilter(){
RowFilter RowFilter=null;
试一试{
rowFilter=rowFilter.regexFilter(_inputField.getText());
}
catch(java.util.regex.PatternSyntaxException-ex){
返回;
}
_分拣机。设置行过滤器(行过滤器);
_表.setRowSorter(_sorter);
}
我的调试器向我显示,rowFilter已初始化,因此它不可能是因为错误的正则表达式。此外,每次击键时都会调用newFilter()
提前谢谢。如果需要,我很乐意提供更多信息
真诚地,
Michael教程包含另一个示例
对于不区分大小写的,必须设置
TableRowSorter#setRowFilter(
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);
}
});
final tablerowserter sorter=新的tablerowserter(tableFxModel);
myTable.setRowSorter(分拣机);
filterFxText.getDocument().addDocumentListener(新的DocumentListener()){
私有无效searchFieldChangedUpdate(DocumentEvent evt){
String text=filterxtext.getText();
如果(text.length()==0){
分拣机设置行过滤器(空);
}否则{
试一试{
sorter.setRowFilter(RowFilter.regexFilter(“(?i)”+文本));
}捕获(模式语法异常pse){
showMessageDialog(null,“错误的正则表达式模式”,
“错误的正则表达式模式”,JOptionPane。错误消息);
}
}
}
@凌驾
公共作废插入更新(DocumentEvent evt){
searchFieldChangedUpdate(evt);
}
@凌驾
公共作废移除更新(DocumentEvent evt){
searchFieldChangedUpdate(evt);
}
@凌驾
公共作废更改日期(DocumentEvent evt){
searchFieldChangedUpdate(evt);
}
});
似乎JTable和TableRowSorter都有不同的表模型。TableRowSorter应使用JTable的表模型构建。首先,在该块上打印堆栈跟踪比调试更容易,以便能够知道初始化RowFilter期间是否有错误
catch(java.util.regex.PatternSyntaxException ex) {
ex.printStackTrace();
return;
}
我找不到代码有任何错误,看起来问题出在正则表达式上。因此,如果您可以针对希望显示的行之一测试输入到JTextField中的正则表达式,看看它是否匹配:
是什么让你认为这与案例有关;-)这意味着。*应该显示所有行,对吗?此外,没有打印stacktrace,因此应该可以工作。我为JTable使用的表模型创建了一个变量。然后我使用了\u sorter=newtablerowsorter(\u model)代码>现在它可以工作了。谢谢!