- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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/
我有一个 TableView,其中包含可观察的 Person 项目列表。每行显示一个 Person 对象,并且还显示其 name 属性。 我想将此可观察量传递到过滤列表中,并在名称属性上设置谓词。 我
关闭。 这个问题需要 debugging details 。它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and
我创建了 NSPredicate 来搜索我的核心数据中的字符串。所以在这种情况下,有谁知道如何在 NSString 中保存结果 [fetchRequest setPredicate:predicate
本文整理了Java中org.eclipse.persistence.internal.oxm.XPathFragment.setPredicate()方法的一些代码示例,展示了XPathFragmen
我是一名优秀的程序员,十分优秀!