Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JTextField的JTable过滤不';行不通_Java_Swing_Jtable_Filtering - Fatal编程技术网

Java 使用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

我有一个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);
}
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)现在它可以工作了。谢谢!