【问题标题】:JTable Row filtering by JTextField valueJTable Row 按 JTextField 值过滤
【发布时间】:2013-10-22 06:23:51
【问题描述】:

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

【问题讨论】:

  • 您为什么不阅读How to Use Tables 上的 Swing 教程以获取工作示例?您之前已经多次获得该教程的链接。

标签: java swing jtable jtextfield rowfilter


【解决方案1】:

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

【讨论】:

  • 我加了table.setRowSorter(sorter);,但没有生效!
  • hmm -- downvoter 关心解释一下?这是 OP 提供的 sn-p 中的一个明显遗漏,因此是一个很好的第一次捕获。
【解决方案2】:

您在UserPage_Admin() 构造函数中调用RowFilter.regexFilter(filterTF.getText(), 0);。它应该如何从 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
            }
        });

但是,正如下面的 cmets 中所建议的,要使用 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 时,有人输入了"$%^&amp;" 这样的文本。对于此类无效输入,即使未对数据源进行有效更改,KeyEvent 仍将被触发。但是,DocumentListeners 仅在对数据源进行了有效更改时才会收到通知。数据输入组件产生事件,其中validator 可以侦听asynchronously,永远不应该DocumentListener 内的文本组件的modify the contents。如果我们这样做,程序很可能会死锁。

【讨论】:

  • 不要使用 KeyListener。使用 DocumentListener。
  • 不,这不是键绑定的情况。阅读教程以获取工作示例。
  • AWT 使用了 KeyListener,因为没有其他选择。 Swing 有更好的 API,应该使用。我们将一半的时间花在论坛上回答问题,因为人们在网络上找到了专为设计的旧代码
  • 是的,我认真地这么认为:不要让他们从一开始就养成坏习惯 :-)
  • @mKobel,我不想在这里编写教程代码,我已经从 java 网站链接了文档和一个教程页面。我最好编写一小部分代码结构并标记最重要的功能,以便它们可以立即进入轮子。
【解决方案3】:

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

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

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

    2. 从 ENTER 键调用的 ActionListener

  • 两种方式都添加到 JTextField


  • 那么还有另外两个非常重要的选项

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

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


  • 一切都取决于你的目标

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-10-27
  • 2015-08-03
  • 2021-09-20
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多