0

我在我的 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);
}
4

3 回答 3

8

RowFilter.regexFilter(filterTF.getText(), 0);UserPage_Admin() 构造函数中调用。它应该如何从 filterTF中读取文本。我认为您应该从分配给 a 的动作事件侦听器中调用它,该侦听器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));
        }
      }
    }); 

如果您想在用户键类型事件上使用过滤,请将键侦听器添加到您正在输入过滤器字符串的文本字段。

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

但是,正如下面评论中所建议的那样,要使用 Swing 文本组件,应该使用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输入 an 时,有人输入了类似"$%^&". KeyEvent即使没有对数据源进行有效更改,对于此类无效输入,仍会触发。但是,DocumentListeners仅当对数据源进行了有效更改时才会收到通知。数据输入组件产生 avalidator可以侦听的事件,asynchronously永远不应该从a 中修改文本组件的内容DocumentListener。如果我们这样做,程序很可能会死锁。

于 2013-10-14T16:31:25.220 回答
1

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

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

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

    2. 从 ENTER 键调用的 ActionListener

  • 两种方式都添加到 JTextField


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

    1. 过滤整个 JTables、列和行(您的代码在谈论 ???)

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


  • 一切都取决于你的目标

  • 一切都使用 API 中实现的标准方法

于 2013-10-14T17:54:33.363 回答
0

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

于 2013-10-14T16:19:26.353 回答