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

JavaFX FilteredList,基于列表中项的属性进行过滤

游安康
2023-03-14

在这种情况下,我需要根据项的某些属性(即条件是内部的而不是外部的)筛选ObservableList 。我发现javafx有FilteredList,所以我尝试了一下。我可以设置谓词和筛选工作,直到确定筛选的属性值发生变化。现在可以像下面这样设置谓词:

list.setPredicate(t -> !t.filteredProperty().get())

由于谓词返回boolean而不是BooleanProperty,因此对该属性的更改不会反映在列表中。

对此有什么简单的解决办法吗?我可以尝试做一些变通方法,例如创建一个单独的列表并同步它,或者每次属性在一个项目中发生变化时重置谓词,希望重新触发过滤,但我首先想问一下,如果有人知道一个很好的解决方案,因为这些变通方法肯定不是。

共有1个答案

端木狐若
2023-03-14

使用提取器创建基础列表。这将使基础列表在任何元素的filteredproperty()更改时触发更新事件。FilteredList将观察这些事件,并相应更新:

ObservableList<Item> baseList = FXCollections.observableArrayList(item -> 
    new Observable[] {item.filteredProperty()});
FilteredList<Item> list = new FilteredList<>(baseList, t -> ! t.filteredProperty().get());

快速演示:

import java.util.stream.IntStream;

import javafx.beans.Observable;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener.Change;
import javafx.collections.ObservableList;
import javafx.collections.transformation.FilteredList;


public class DynamicFilteredListTest {

    public static void main(String[] args) {

        ObservableList<Item> baseList = FXCollections.observableArrayList(item -> 
                new Observable[] {item.filteredProperty()});

        FilteredList<Item> list = new FilteredList<>(baseList, t -> ! t.isFiltered());

        list.addListener((Change<? extends Item> c) -> {
            while (c.next()) {
                if (c.wasAdded()) {
                    System.out.println(c.getAddedSubList()+ " added to filtered list");
                }
                if (c.wasRemoved()) {
                    System.out.println(c.getRemoved()+ " removed from filtered list");
                }
            }
        });

        System.out.println("Adding ten items to base list:\n");

        IntStream.rangeClosed(1, 10).mapToObj(i -> new Item("Item "+i)).forEach(baseList::add);

        System.out.println("\nFiltered list now:\n"+list);

        System.out.println("\nSetting filtered flag for alternate items in base list:\n");

        IntStream.range(0, 5).map(i -> 2*i).mapToObj(baseList::get).forEach(i -> i.setFiltered(true));

        System.out.println("\nFiltered list now:\n"+list);
    }


    public static class Item {
        private final StringProperty name = new SimpleStringProperty() ;
        private final BooleanProperty filtered = new SimpleBooleanProperty() ;

        public Item(String name) {
            setName(name);
        }

        public final StringProperty nameProperty() {
            return this.name;
        }

        public final String getName() {
            return this.nameProperty().get();
        }

        public final void setName(final String name) {
            this.nameProperty().set(name);
        }

        public final BooleanProperty filteredProperty() {
            return this.filtered;
        }

        public final boolean isFiltered() {
            return this.filteredProperty().get();
        }

        public final void setFiltered(final boolean filtered) {
            this.filteredProperty().set(filtered);
        }

        @Override
        public String toString() {
            return getName();
        }
    }
}
 类似资料:
  • 我有一个使用Postgre 9.3和JPA2.1(Hibernate实现)的Spring MVC应用程序。我有一个类'电影',其中有一组评论。我想写一个JPA NamedQuery,它返回我所有的电影细节,但只有批准的评论。评论可以有其他状态,但我想只显示批准的评论。 我的班级如下所示: 我写的查询不会过滤评论并返回包含所有评论的电影;它的工作原理与上面显示的findMovieById查询相同。

  • 基于 那个东西的 以下是我目前所尝试的: 我想使用一个Java8流和两个getter的lambdas来完成这一操作,这两个getter最终检索用于确定唯一性的属性,但不确定如何实现。当用于比较的属性位于pojo的顶层时,我知道如何做,但当属性嵌套在另一个对象中时,我不知道如何做。

  • 我正在尝试过滤scala中对象列表的列表属性。例如: 用java定义的类 我的过滤器函数返回字符串列表而不是结果列表 UPDATE我想取回listOf中的所有结果,其中每个结果的名称属性被过滤。

  • 我正试图从基于某些属性的对象列表中删除重复项。 我们能用一种简单的方法使用Java8吗 我们是否可以根据员工的属性删除其中的重复项。我看到过从String的arraylist中删除重复字符串的帖子。

  • 我有一个类似这样的组对象 和如下所示的Item对象

  • 我需要一个带有System_id、name、description等的Registered_Systems表。现在,每个系统可以有n个属性,我计划将它们存储在子表Registered_System_Attributes(System_id、Attribute_name、Attribute_Value)中,外键为Registered_Systems.System_id 由于属性必须与系统相关联,所以