java绑定属性<Predicate<MyObject>>到ListView(使用SelectionMode.MULTIPLE)
我试图在ListView
和ObjectProperty
之间绑定,其中可以选择多个项目。选择项目时,我希望相应地筛选TableView
列:
使用两个较低的过滤器(组件、详细信息),我按如下方式进行绑定:
ObjectProperty<Predicate<Log>> detailsSearchFilter = new SimpleObjectProperty<>();
TextField detailsSearchField = new TextField();
detailsSearchField.setPromptText("e.g. finished initializing");
detailsSearchFilter.bind(Bindings.createObjectBinding(() ->
log -> log.getDetails().toLowerCase().contains(detailsSearchField.getText().toLowerCase()),
detailsSearchField.textProperty()
));
然后,稍后添加逻辑运算符方法and()
,以便能够组合所有筛选器:
logFilteredList.predicateProperty().bind(Bindings.createObjectBinding(() ->
detailsSearchFilter.get().and(componentSearchFilter.get()).and(sourceFilter.get()),
detailsSearchFilter, componentSearchFilter, sourceFilter
));
对于其他两个ListView
过滤器,我正在考虑这样做:
private final static String[] sources = new String[]{"ECS","IISNode","PrismWebServer"};
ListView<String> sourceList = new ListView<>();
ObservableList sourceItems = FXCollections.observableArrayList(sources);
sourceList.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
sourceList.getItems().addAll(sources);
ListView<String> selected = new ListView<>();
sourceList.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
selected.setItems(sourceList.getSelectionModel().getSelectedItems());
System.out.println(Arrays.toString(selected.getItems().toArray()));
});
因此selected
列表现在包括当前选择的所有值。
如何将sourceFilter
与selected
列表的所有值绑定
我在考虑迭代列表中的每个值并以这种方式绑定:
sourceFilter.bind(Bindings.createObjectBinding(() ->
log -> log.getSource().toLowerCase().contains(selected.getItems().get(i).toLowerCase()),
sourceList.selectionModelProperty()
));
但它似乎不是很优雅,我也不确定我是否以正确的方式使用了selectionModelProperty
# 1 楼答案
只有当
selectionModel
被替换时,selectionModelProperty
才会触发更改,这通常不会发生。依赖项应该是sourceList.getSelectionModel().getSelectedItems()
此外,根据我的理解,您应该查询
Log
的source
是否在所选项目中,而不是source
字符串是否在所选项目列表的某个位置包含字符串的某个部分还需要注意的是,应该避免仅使用
ListView
来存储数据,对于大型列表,对Set
而不是List
进行contains
检查要高效得多您可以使用如下代码: