JTable按JTextField值过滤行

时间:2013-10-14 16:05:33

标签: 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);
}

3 个答案:

答案 0 :(得分: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));
        }
      }
    }); 

如果要对用户密钥类型事件使用过滤,请将key listener添加到您正在输入过滤字符串的文本字段中。

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

但是,正如下面的评论中所建议的那样,要使用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) {}
    });

编辑:为什么更适合使用DocumentListener?

如果我们想要验证数据源中的输入,在过滤数据时使用KeyEvent,您会发现它不会反映用户的击键,并且输入事件会在数据处理之前发送给侦听器资源。假设当我们想要输入user name时,有人会输入"$%^&"这样的文本。在这样的无效输入上,即使没有对数据源进行有效更改,仍会触发KeyEvent。但是,只有在对数据源进行了有效更改时才会通知DocumentListeners。数据输入组件产生的事件validator可以监听asynchronouslyDocumentListener中的文本组件永远不应该modify the contents。如果我们这样做,该程序可能会陷入僵局。

答案 1 :(得分:1)

  

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

  • 有两种方法,你没有提到预期的逻辑

    1. 从DocumentListener过滤KeyTyped(您的代码在谈论???)

    2. 来自ActionListener的
    3. 从ENTER键调用

  • 两种方式都添加到JTextField


  • 然后还有另外两个非常重要的选项

    1. 过滤整个JTable,列和行(你的代码在谈论???)

    2. 在一个(很可能在两个或更多,从未尝试过)列


  • 一切都取决于您的目标

  • 使用API​​

  • 中实现的标准方法完成所有工作

答案 2 :(得分:0)

初始化后,您只是无法使用 sorter 。你应该调用 JTable.setRowSorter()