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

JavaFX:过滤列表的setPredicate方法的错误使用

长孙正卿
2023-03-14

因此,筛选后的列表将只包含具有选定名称的person项。

下面的代码几乎实现了我想要的一切。但是,也有一种边缘情况,即它不能按预期工作。例如,我双击带有“name=john”的person。过滤列表将过滤所有姓名为“John”的人。现在,如果我将过滤列表中的一个人名更改为“Tim”。此人仍保留在筛选列表中。理想情况下,我希望它自动移除。但我做不到。

我认为我没有正确地使用setpredicate,因为我觉得我在编写多余的代码,应该有更有效的方法来做到这一点,并在编辑后自动删除具有不同名称的Person。

private StringProperty Name;
private final BooleanProperty filteredName = new SimpleBooleanProperty() ;  

public final boolean getFilteredName(){
    return filteredNameProperty().getValue();
}

public final BooleanProperty filteredNameProperty(){
    return this.filteredName;
}

public final void setFilteredName(String name){
    if(getName().equals(name)){
        this.filteredNameProperty().set(true);
    } else{
        this.filteredNameProperty().set(false);
    }
} 
        private ObservableList<Person> observableListOfPerson = FXCollections.observableArrayList(p->
        new Observable[]{
                p.nameProperty(),
                p.filteredNameProperty()
        }
    );
        private FilteredList<Person> filterListOfPerson= new FilteredList<>(observableListOfPerson, p-> p.filteredNameProperty().get());

public void initializeFilteredTable(){
        filteredTab.setText("Filtered History");
        filterTable.setItems(filterListOfPerson);

        filterListOfPerson.addListener(new ListChangeListener<Person>(){
              @Override
                public void onChanged(ListChangeListener.Change change) {
                  filterTable.setItems(filterListOfPerson);
              }
        });
        filterTable.setItems(filterListOfPerson);}
public class AnimatedRow<T> extends TableRow<T> {
    private TabPane fxTabPaneLower;

    /**
     * The data as an observable list of Person.
     */
    private ObservableList<Person> observableListOfPerson;
    private FilteredList<Person> filterListOfPerson;

    public AnimatedRow(Function<T, StringExpression> nameExtractor, ObservableList<Person> observableListOfPerson, FilteredList<Person> filterListOfPerson, TabPane fxTabPaneLower) {
                   setOnMouseClicked(event -> {
            if (event.getClickCount() == 2 && (!isEmpty()) ) {
                final StringExpression nameBE = nameExtractor.apply(getItem());
                for(Person t : observableListOfPerson){
                    t.setFilteredName(nameBE.get());

                }
                filterListOfPerson.setPredicate(p-> p.filteredNameProperty().get());

                fxTabPaneLower.getSelectionModel().select(1);
                ((TableView<Person>)fxTabPaneLower.getTabs().get(1).getContent()).setItems(filterListOfPerson);              
          }
        });
    }
}

共有1个答案

徐皓君
2023-03-14

(这实质上是JavaFX FilteredList的重复,基于列表中项的属性进行过滤。)

看起来您正在尝试在Person类中实现筛选。FilteredList的全部意义在于它为您实现过滤器

所以我认为您只需完全删除FilteredName属性,然后

public AnimatedRow(Function<T, StringExpression> nameExtractor, ObservableList<Person> observableListOfPerson, FilteredList<Person> filterListOfPerson, TabPane fxTabPaneLower) {
    setOnMouseClicked(event -> {
        if (event.getClickCount() == 2 && (!isEmpty()) ) {
            final StringExpression nameBE = nameExtractor.apply(getItem());
            filterListOfPerson.setPredicate(p-> p.getName().equals(nameBE.get()));

            fxTabPaneLower.getSelectionModel().select(1);
            ((TableView<Person>)fxTabPaneLower.getTabs().get(1).getContent()).setItems(filterListOfPerson);              
        }
    });
}
 类似资料:
  • 我正在用JavaFX作为辅助项目构建一个日志阅读器,当我试图在上实现过滤时,我走到了死胡同。 我有几个< code >复选框(图片的LHS ),它们基本上充当< code>TableView将显示的内容的过滤器: 单击按钮后,将打开一个后台线程来读取和分析文件。一旦操作终止,每次读取日志的结果都会插入全局 的情况。 < li >未选中< code >复选框的情况。 对于1。我在想处理这件事的最好方

  • 问题内容: 我开始使用django-tables2(从第一印象中就可以强烈推荐),我问自己如何实现列过滤。我找不到合适的文档,但是我确定它在那里。 问题答案: 答案有点晚了,但是无论如何…我也找不到任何合适的文档来进行列过滤。有很多方法可以做到这一点: 答:手动:我添加了一个包含要过滤的字段的表单,然后在我的视图中执行以下操作: 这很好用,但是不是那么干,因为它在视图中是硬编码的。 B.使用Sin

  • 4.5. 过滤列表 如你所知,Python 具有通过列表解析(第 3.6 节 “映射 list”)将列表映射到其它列表的强大能力。这种能力同过滤机制结合使用,使列表中的有些元素被映射的同时跳过另外一些元素。 过滤列表语法: [mapping-expression for element in source-list if filter-expression] 这是你所知所爱的 列表解析 的扩展。

  • 在这种情况下,我需要根据项的某些属性(即条件是内部的而不是外部的)筛选。我发现javafx有,所以我尝试了一下。我可以设置谓词和筛选工作,直到确定筛选的属性值发生变化。现在可以像下面这样设置谓词: 由于谓词返回boolean而不是BooleanProperty,因此对该属性的更改不会反映在列表中。 对此有什么简单的解决办法吗?我可以尝试做一些变通方法,例如创建一个单独的列表并同步它,或者每次属性在

  • 问题内容: 在Java程序中,我有一个要基于特定属性过滤的bean列表。 例如,假设我有一个Person列表,一个JavaBean,其中Person具有许多属性,其中包括“名称”。 我也有一个名字列表。 现在,我想查找姓名在姓名列表中的所有人员。 使用Google Guava执行此过滤器的最佳方法是什么? 到目前为止,我已经考虑过将Guava与Apache beanutils结合使用,但这似乎并不