gpt4 book ai didi

Javafx:过滤列表的 setPredicate 方法的使用不正确

转载 作者:行者123 更新时间:2023-12-01 11:08:00 26 4
gpt4 key购买 nike

我有一个 TableView,其中包含可观察的 Person 项目列表。每行显示一个 Person 对象,并且还显示其 name 属性。

我想将此可观察量传递到过滤列表中,并在名称属性上设置谓词

我想要实现的是:如果我双击 TableView 中包含 Person 项的任意一行,我将能够提取所选 Person 对象的 names 属性并将过滤列表的谓词设置为所选名称

因此过滤后的列表将仅包含具有所选名称的 Person 项目。

下面的代码几乎实现了我想要的一切。但是,有一个边缘情况,它无法按预期工作。例如,当我双击“name = John”的人时。过滤列表将过滤所有名为“John”的人。现在,如果我将过滤列表中的一个人的名字更改为“Tim”。此人仍保留在过滤列表中。理想情况下,我希望它自动被删除。 但我做不到。

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

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

在我的 Controller 中,我有:

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

在我的 AnimatedRow 类中,我有:

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

最佳答案

(这本质上是 JavaFX FilteredList, filtering based on property of items in the list 的重复。)

看起来您正在尝试在 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);
}
});
}

只要您将 name 属性作为基础列表提取器的一部分返回,过滤器就会在名称更改时重新评估。

关于Javafx:过滤列表的 setPredicate 方法的使用不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32723693/

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