gpt4 book ai didi

JavaFX FilteredList,根据列表中项目的属性进行过滤

转载 作者:行者123 更新时间:2023-12-04 17:25:36 27 4
gpt4 key购买 nike

我有一个案例需要过滤 ObservableList<Item>基于项目的某些属性(即条件是内部的而不是外部的)。我发现 javafx 有 FilteredList所以我试了一下。我可以设置谓词和过滤工作,直到确定过滤的属性值发生变化。现在设置谓词如下:

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

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

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

最佳答案

使用 extractor 创建基础列表.这将使基础列表能够在任何元素的 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();
}
}
}

关于JavaFX FilteredList,根据列表中项目的属性进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30915007/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com