2016-01-18 4 views
0

У меня есть класс с именем «MyObject», как это:FIlteredList с пользовательскими объектами

public class MyObject { 
    private int type; 
    private byte[] file; 
    private String fileName; 
    private String titolo; 

    public MyObject(String tit, int t, byte[] b, String name) 
    {  
      titolo= tit; 
      type = t; 
      file = b; 
      fileName = name; 
    } 


    int getType(){ 
     return type; 
    } 
    String getfileName(){ 
     return fileName; 
    } 
    byte[] getFile(){ 
     return file; 
    } 
    String getTitolo(){ 
     return titolo; 
    } 
} 

я разработал, как загрузить элемент списка, теперь, я хочу, чтобы фильтровать с FilterList. Я хотел бы фильтровать «titolo» и «fileName». Это другой класс, где я работаю прямо сейчас:

public class ContentTab extends VBox{ 
    Label allegati; 
    TextField inseriscitesto; 
    ListView<MyObject> view; 
    ObservableList<MyObject> data; 

    public ContentTab(int width){ 

     setPadding(new Insets(20)); 
     setSpacing(10); 
     allegati = new Label("Allegati alla lezione"); 
     allegati.setFont(Font.font("Verdana", 13)); 
      inseriscitesto = new TextField(""); 
     data = FXCollections.observableArrayList(); 

     view = new ListView<MyObject>(data); 

     view.setStyle("-fx-background-color: transparent;"); 
     setPrefWidth(width); 
     getChildren().addAll(allegati,inseriscitesto, view); 


    } 

    public void loadElement(List<MyObject> element){ 

     for(int i = 0; i< element.size(); i++) 
      data.add(element.get(i)); 

        view.setCellFactory(new Callback<ListView<MyObject>, ListCell<MyObject>>() { 

      @Override 
      public ListCell<MyObject> call(ListView<MyObject> arg0) { 
       return new ListCell<MyObject>() { 

        @Override 
        protected void updateItem(MyObject item, boolean bln) { 
         super.updateItem(item, bln); 
         if (item != null) { 
          setStyle("-fx-background-color: transparent;"); 
          VBox vBox = new VBox(new Text(item.getTitolo()), new Text(item.getfileName())); 
          ImageView placeHolder; 

          if(item.getType() == myMediaType.PDF){ 
           placeHolder= new ImageView(new Image("img/pdf.jpg")); 
          placeHolder.setScaleX(0.5); 
          } 
          else 
           placeHolder= new ImageView(new Image("img/video.jpg")); 
          HBox hBox = new HBox(placeHolder, vBox); 

          hBox.setSpacing(10); 
          setGraphic(hBox); 
         } 
        } 

       }; 
      } 

     }); 
    } 

    public void FilterElement(List<MyObject> element){ 

    FilteredList<MyObject> filteredData = new FilteredList<>(data, s -> true); 

    inseriscitesto.textProperty().addListener(obs->{ 
     String filter = inseriscitesto.getText(); 
     if(filter == null || filter.length() == 0) { 
      filteredData.setPredicate(s -> true); 
     } 
     else { 
      filteredData.setPredicate(s -> ((List<MyObject>) s.).contains(filter)); 
     } 
    }); 


    } 

Итак, мой вопрос, как я могу фильтровать по свойству MyObject в FilterElement методы?

Извините, если я был неясно или код слишком много, но я думаю, что я поставил только что необходимо, чтобы объяснить вопрос.

ответ

1

Вы должны установить ListView элементы, чтобы быть отфильтрованный список, и сохранить ссылку на него, изменяя его предикат как изменения текста:

public class ContentTab extends VBox{ 
    Label allegati; 
    TextField inseriscitesto; 
    ListView<MyObject> view; 

    public ContentTab(int width){ 

     setPadding(new Insets(20)); 
     setSpacing(10); 
     allegati = new Label("Allegati alla lezione"); 
     allegati.setFont(Font.font("Verdana", 13)); 
      inseriscitesto = new TextField(""); 
     FilteredList<MyObject> filteredData = new FilteredList(FXCollections.observableArrayList(), s -> true); 

     view = new ListView<MyObject>(filteredDate); 
     inseriscitesto.textProperty().addListener(obs->{ 
      String filter = inseriscitesto.getText(); 
      if(filter == null || filter.length() == 0) { 
       filteredData.setPredicate(s -> true); 
      } 
      else { 
       filteredData.setPredicate(s -> s.getTitolo().contains(filter)); 
      } 
     }); 

     view.setStyle("-fx-background-color: transparent;"); 
     setPrefWidth(width); 
     getChildren().addAll(allegati,inseriscitesto, view); 

    } 

Кроме того, обратите внимание, что ваш предикат должен быть функцией, которая принимает MyObject и возвращает true, если он должен быть отображен, или false, если он должен быть отфильтрован. Я предполагаю, что вы хотите проверить, содержит ли свойство Titolo текст фильтра, но вы можете изменить его на другое свойство.