2015-02-11 4 views

risposta

11

Questo è piuttosto semplice e lineare:

@Override 
public void start(Stage primaryStage) { 

    ObservableList<String> data = FXCollections.observableArrayList(); 
    IntStream.range(0, 1000).mapToObj(Integer::toString).forEach(data::add); 

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

    TextField filterInput = new TextField(); 
    filterInput.textProperty().addListener(obs->{ 
     String filter = filterInput.getText(); 
     if(filter == null || filter.length() == 0) { 
      filteredData.setPredicate(s -> true); 
     } 
     else { 
      filteredData.setPredicate(s -> s.contains(filter)); 
     } 
    }); 


    BorderPane content = new BorderPane(new ListView<>(filteredData)); 
    content.setBottom(filterInput); 

    Scene scene = new Scene(content, 500, 500); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 
+0

questo può essere raggiunto senza usare experssions Lambda? Il mio progetto java è basato su Java7. Grazie. –

+0

@SachinGadagi Ovviamente. Nel caso più semplice: basta sostituire i lambas con classi interne anonime. – eckig

+1

Adoro lambda, può anche essere semplificato in 'filteredData.setPredicate (newValue.isEmpty()? S -> true: s -> s.getKey(). Contains (newValue));' –