JTable按JTextField值过滤行

Saj*_*jad 0 java swing jtable jtextfield rowfilter

我在JTextfield上输入了一个名字,但是我的桌子没有过滤任何东西!

我的代码:

public class UserPage_Admin extends JFrame {

JTable table;
UserModel model;
public UserPage_Admin() {

    model = new UserModel(...);
    TableRowSorter sorter = new TableRowSorter<TableModel>(model);
    table = new JTable(model);
    table.setRowSorter(sorter);

    add(new JScrollPane(table), BorderLayout.CENTER);
    add(panelForm(), BorderLayout.PAGE_START);

    RowFilter<UserModel, Object> rf = null;
    try {
        rf = RowFilter.regexFilter(filterTF.getText(), 0);
    } catch (PatternSyntaxException pse) {
        return;
    }
    sorter.setRowFilter(rf);

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(850, 600);
    setVisible(true);
}
Run Code Online (Sandbox Code Playgroud)

Sag*_*age 8

RowFilter.regexFilter(filterTF.getText(), 0);UserPage_Admin() 构造函数中调用.它应该如何从filterTF 读取文本.我认为你应该从分配给一个动作事件监听器调用它,JButton在提交(点击)文本时将调用它,如下所示:

submitButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        String text = filterText.getText();
        if (text.length() == 0) {
          sorter.setRowFilter(null);
        } else {
          sorter.setRowFilter(RowFilter.regexFilter(text, 0));
        }
      }
    }); 
Run Code Online (Sandbox Code Playgroud)

如果要对用户键类型事件使用过滤,请将键侦听器添加到要输入过滤器字符串的文本字段中.

filterTxtFeild.addKeyListener(new KeyAdapter() {
            public void keykeyReleased(KeyEvent evt) {
              // on each key type event filter. 
             // put your filter code as submit button
            }
        });
Run Code Online (Sandbox Code Playgroud)

但是,正如下面的评论中所建议的那样,要使用Swing Text Component,应该使用Document.addDocumentListener(DocumentListener).Swing文本组件使用Document来表示其内容.当文档内容以任何方式更改时,都会发生文档事件.添加文档侦听器,如下所示:

filterTxtFeild.getDocument().addDocumentListener(new DocumentListener() {

      @Override
      public void insertUpdate(DocumentEvent e) {
        // put your filter code here upon data insertion
      }

      @Override
      public void removeUpdate(DocumentEvent e) 
      { 
            //put your filter code here upon data removal
      }

      @Override
      public void changedUpdate(DocumentEvent e) {}
    });
Run Code Online (Sandbox Code Playgroud)

编辑:为什么DocumentListener更可取?

如果我们想要验证数据源中的输入,则KeyEvent在过滤数据时使用,您将发现它不会反映用户的击键,并且输入事件会在数据源处理之前发送给侦听器.假设当我们想要user name输入时,有人输入了一个文本"$%^&".在这样的无效输入上,KeyEvent即使没有对数据源进行有效更改,仍将被触发.但是,DocumentListeners仅在对数据源进行了有效更改时才会收到通知.数据输入组件产生validator可以监听的事件asynchronously,不应该从a内修改文本组件的内容DocumentListener.如果我们这样做,该程序可能会陷入僵局.

  • KeyListener与AWT一起使用,因为没有其他选择.Swing有更好的API应该使用.我们将一半的时间花在论坛上回答问题,因为人们会在网上找到专为此设计的旧代码 (2认同)