当前位置: 首页 > 知识库问答 >
问题:

使用TextField的JavaFX TableView筛选器

陈龙野
2023-03-14

我想编写一个方法,在该方法中传递textfield(filterField)、来自tableview(data)和tableview(table)的数据,以便筛选所有表数据,每次在textfield中释放键时,都会检查键入的字符串是否包含在表的任何单元格中。

为此,我使用以下代码:

public void addTextFilter(ObservableList<List<Object>> allData, 
                           JFXTextField filterField, TableView<List<Object>> table) {

    FilteredList<List<Object>> filteredData  = new FilteredList<>(allData, p -> true);
    filterField.setOnKeyReleased(e -> 
    {
         filteredData.setPredicate(p  -> 
         {
             if (filterField.getText() == null || filterField.getText().isEmpty()){
                 return true;
             }else {
                 return p.contains(filterField.getText()); 
             }
         });


    });

    SortedList<List<Object>> sortedData = new SortedList<>(filteredData);
    sortedData.comparatorProperty().bind(table.comparatorProperty());
    table.setItems(sortedData);
}

此代码仅在textfield中的字符串与表中任何单元格的值完全匹配时返回值。

我将需要它返回表中包含键入字符串的任何单元格,即使该单元格包含更多字符。类似于以下内容:JavaFX8TableView排序和过滤

共有1个答案

淳于健
2023-03-14

您应该监听text属性中的更改,而不是使用KeyEvent

TableColumns可用于检索可在谓词中使用的单元格的值。

public static <T> void addTextFilter(ObservableList<T> allData,
        JFXTextField filterField, TableView<T> table) {

    final List<TableColumn<T, ?>> columns = table.getColumns();

    FilteredList<T> filteredData = new FilteredList<>(allData);
    filteredData.predicateProperty().bind(Bindings.createObjectBinding(() -> {
        String text = filterField.getText();

        if (text == null || text.isEmpty()) {
            return null;
        }
        final String filterText = text.toLowerCase();

        return o -> {
            for (TableColumn<T, ?> col : columns) {
                ObservableValue<?> observable = col.getCellObservableValue(o);
                if (observable != null) {
                    Object value = observable.getValue();
                    if (value != null && value.toString().toLowerCase().equals(filterText)) {
                        return true;
                    }
                }
            }
            return false;
        };
    }, filterField.textProperty()));

    SortedList<T> sortedData = new SortedList<>(filteredData);
    sortedData.comparatorProperty().bind(table.comparatorProperty());
    table.setItems(sortedData);
}

如果您的列包含列表的值,则可以稍微简化代码:

public static void addTextFilter(ObservableList<List<Object>> allData,
        JFXTextField filterField, TableView<List<Object>> table) {

    final List<TableColumn<List<Object>, ?>> columns = table.getColumns();

    FilteredList<List<Object>> filteredData = new FilteredList<>(allData);
    filteredData.predicateProperty().bind(Bindings.createObjectBinding(() -> {
        String text = filterField.getText();

        if (text == null || text.isEmpty()) {
            return null;
        }
        final String filterText = text.toLowerCase();

        return o -> {
            for (Object value : columns) {
                if (value != null && value.toString().toLowerCase().equals(filterText)) {
                    return true;
                }
            }
            return false;
        };
    }, filterField.textProperty()));

    SortedList<List<Object>> sortedData = new SortedList<>(filteredData);
    sortedData.comparatorProperty().bind(table.comparatorProperty());
    table.setItems(sortedData);
}

请注意,上面的代码段都没有被告知对项所做的更改。

 类似资料:
  • 我创建了一个TableView,其中包含一个复选框列(isSelected)和三个信息列(姓名、姓氏、职务)。我想根据用户信息禁用一些复选框。例如,如果用户名为“Peter”,则Peter旁边的复选框将被禁用。但我不能。以下是我的一些代码: 人JAVA 控制器。JAVA

  • 首先,我试图使选择所有复选框,如果我单击表头中的选择所有复选框,整个表行将选择并显示一个复选框反向消息,即我选择了多少复选框。这里的问题是,如果我单击select all复选框,反向消息不会显示楼上的表,即我选择了多少行。 其次,如果我从任何列中筛选任何数字,相同的数字将显示同一列中有多少行具有相同的数字。如果我选中了所有复选框,那么反向消息将显示我选中了多少行复选框。这里,问题是显示整个表行计数

  • 应用筛选器之前的示例使用者记录是(在值中查找GP_ID): 当我在kafkaListenerContainerFactory()中按如下方式设置recordFilterStrategy时: KafKareCordvo.ConvertByteBufferToLong正在将bytebuffer值转换为long值。 但是,当它被Kafka听众按以下方式消费时: 这将返回删除我筛选的字段值的记录:“gp_

  • “{”error“:{”root_case“:[{”type“:”parsing_exception“,”reason“:”[match_all]格式错误的查询,预期[END_OBJECT]但找到[FIELD_NAME]“,”line“:”line“:1,”col“:26}”,“status”:400}“,”type“:”parsing_exception“,”reason“:”[match_al

  • 我的页面中有一个名为“search_table”的DataTable。我在表中有一个附加的标题行,它具有不同的筛选选项(dropdown、text、date_pickers)。对于日期列,我有两个datepicker,一个用于min,一个用于max。我可以根据datepickers为datatable筛选数据,但有一个问题: 当我选择一个日期时,我的表中的所有行都消失了,我必须点击其中的一个标题(

  • 我有一个带有FireBaseRecyclerAdapter的RecyclerView。当用户开始输入SearchView时,我想用一个名称列表填充RecycerView。 也是对查询进行忽略的方法吗?