我正在尝试将列表视图变成过滤后的列表视图。我发现了有关堆栈溢出的说明,但线程已锁定,因此我无法对此问题发表评论。由于某些原因,当我键入表达式时:
filteredOblist.setPredicate(s -> s.contains(filterUID));
s.contains(filteredUID));由于错误而无法工作
错误:(65,51)Java:找不到符号symbol:方法 contains(java.lang.String)location:类型的变量 Controllers.ModelTable
完整代码:
public void initialize(URL location, ResourceBundle resources) {
filter_uid.textProperty().addListener(obs ->{
String filterUID = filter_uid.getText();
if (filterUID == null || filterUID.length() == 0){
filteredOblist.setPredicate(s -> true);
}else {
filteredOblist.setPredicate(s -> s.contains(filterUID));
}
});
定义:
@FXML public TableView<ModelTable> taskManagerView;
@FXML public TableColumn<ModelTable, String> col_UID;
@FXML public TableColumn<ModelTable, String> col_Date;
@FXML public TableColumn<ModelTable, String> col_CreatedBy;
@FXML public TableColumn<ModelTable, String> col_Category;
@FXML public TableColumn<ModelTable, String> col_Task;
@FXML
TextField filter_uid;
@FXML
TextField filter_created;
@FXML
ChoiceBox filtered_choice;
@FXML
DatePicker filter_date;
ObservableList<ModelTable> oblist = FXCollections.observableArrayList();
FilteredList<ModelTable> filteredOblist = new FilteredList<>(oblist, s -> true);
谢谢
答案 0 :(得分:2)
要使其正常工作,您的ModelTable
类应具有contains
这样的方法,
public boolean contains(String uuid) {
return UID.equals(uuid);
}
相反,如果您需要按照评论中所述使用不同的过滤器策略,那么我只需将其从ModelTable
类中移除就可以将责任转移给客户。只需根据需要从ModelTable
访问不同的字段来编写谓词。这是从contains
类中删除ModelTable
方法后两个谓词的样子。
filteredOblist.setPredicate(s -> s.UID.equals(filterUID));
filteredOblist.setPredicate(s -> s.CreatedBy.startsWith(filterCreated));
最重要的是,您的客户必须提供过滤策略,因为它会根据上下文而变化。