因此,筛选后的列表将只包含具有选定名称的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);
}
});
}
}
(这实质上是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。我在想处理这件事的最好方
在这种情况下,我需要根据项的某些属性(即条件是内部的而不是外部的)筛选。我发现javafx有,所以我尝试了一下。我可以设置谓词和筛选工作,直到确定筛选的属性值发生变化。现在可以像下面这样设置谓词: 由于谓词返回boolean而不是BooleanProperty,因此对该属性的更改不会反映在列表中。 对此有什么简单的解决办法吗?我可以尝试做一些变通方法,例如创建一个单独的列表并同步它,或者每次属性在
问题内容: 我开始使用django-tables2(从第一印象中就可以强烈推荐),我问自己如何实现列过滤。我找不到合适的文档,但是我确定它在那里。 问题答案: 答案有点晚了,但是无论如何…我也找不到任何合适的文档来进行列过滤。有很多方法可以做到这一点: 答:手动:我添加了一个包含要过滤的字段的表单,然后在我的视图中执行以下操作: 这很好用,但是不是那么干,因为它在视图中是硬编码的。 B.使用Sin
4.5. 过滤列表 如你所知,Python 具有通过列表解析(第 3.6 节 “映射 list”)将列表映射到其它列表的强大能力。这种能力同过滤机制结合使用,使列表中的有些元素被映射的同时跳过另外一些元素。 过滤列表语法: [mapping-expression for element in source-list if filter-expression] 这是你所知所爱的 列表解析 的扩展。
问题内容: 在Java程序中,我有一个要基于特定属性过滤的bean列表。 例如,假设我有一个Person列表,一个JavaBean,其中Person具有许多属性,其中包括“名称”。 我也有一个名字列表。 现在,我想查找姓名在姓名列表中的所有人员。 使用Google Guava执行此过滤器的最佳方法是什么? 到目前为止,我已经考虑过将Guava与Apache beanutils结合使用,但这似乎并不