当前位置: 首页 > 面试题库 >

通过JTextField值对JTable行进行过滤

鲜于温书
2023-03-14
问题内容

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

问题答案:

您正在呼叫RowFilter.regexFilter(filterTF.getText(), 0);UserPage_Admin()
构造。它应该如何从filterTF中读取 文本 。我认为您应该从分配给的Action Event
Listener调用它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 Text Component,应使用
Document.addDocumentListener(DocumentListener)

。Swing文本组件使用文档来表示其内容。文档内容以任何方式更改时,都会发生文档事件。如下添加文档侦听器:

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可以监听asynchronously,一个人绝对不能从一个组件内修改文本组件的内容DocumentListener。如果这样做,程序可能会死锁。



 类似资料:
  • 问题内容: 我有一个MySql表,我想查询其中 成对 的列在特定集中的行。例如,假设我的表格如下所示: 现在,我希望提取其中 (f1,f2) 对为(’a’,30)或(’b’,20)的行,即行2,3,4。我也希望使用“ IN”样式的过滤器来完成此操作,因为我可能有很多对要提取。如果我尝试类似的方法: 我得到IN子句中为f1和f2指定的值的笛卡尔积,即具有f1 =’a’或’b’的所有可能组合的行,以及

  • 我的目标是通过拖放对tableview进行排序。我举了一个例子:http://docs.oracle.com/javafx/2/fxml_get_started/fxml_tutorial_intermediate.htm 对于拖放,我通过Scene Builder添加了fxml 制造了控制器 但是在drag Drop,我无法得到我扔下物体的那排位置。我得到的只是手机信息<代码>文本[Text=“

  • 问题内容: 是否可以通过if条件执行多个分配,如以下代码? 问题答案: 否。根据规范,在if语句的开头仅允许一个“简单语句” 。 该建议的方法是这可能会返回一个错误,所以我想你想是多重考验:

  • 利用通配符进行复杂的数据操作。 LIKE 与 REGEXP 操作符 当需要搜索产品文本中包含某个特定关键字的所有产品,使用通配符来创建比较特定的数据搜索模式。 通配符(wildcard) 用来匹配值的一部分特殊字符。 搜索模式(search pattern) 由字母值,通配符两租组合构成的搜索条件。 通配符是SQL的WHERE子句中的特殊含义字符,子句中使用通配符必须使用LIKE操作符。 百分号%

  • 你可以使用内置的 yield* 操作符来组合多个 Sagas,使得它们保持顺序。 这让你可以一种简单的程序风格来排列你的 宏观任务(macro-tasks)。 function* playLevelOne(getState) { ... } function* playLevelTwo(getState) { ... } function* playLevelThree(getState) { .

  • 好吧,这很难解释,但我会尽力的。 我在JTable中有一个JTextField和一个JComboBox,它的getCellEditor方法被覆盖如下: 以下是行为差异(请注意,从现在开始,当我说JTextField或JComboBox时,我指的是JTable中包含任一组件的单元格): > 当我使用tab键或箭头键导航到JTextField,然后开始键入时,我键入的字符会自动输入单元格。然而,当我以