筛选列表无法使用.contains

时间:2019-02-19 06:33:59

标签: java javafx java-8

我正在尝试将列表视图变成过滤后的列表视图。我发现了有关堆栈溢出的说明,但线程已锁定,因此我无法对此问题发表评论。由于某些原因,当我键入表达式时:

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

谢谢

1 个答案:

答案 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));

最重要的是,您的客户必须提供过滤策略,因为它会根据上下文而变化。