Я не знаю Kotlin / TornadoFX, но вот решение JavaFX, которое вы (или другие) можете перевести.
Основная идея c состоит в том, чтобы создать FilteredList
и связать его. predicateProperty
до Predicate
, что зависит от соответствующего StringProperty
. Существуют различные библиотечные методы для создания такой привязки. Например, вы можете сделать:
filteredList = new FilteredList<>(baseList);
filteredList.predicateProperty().bind(
new ObjectBinding<>() {
{
super.bind(prop);
}
@Override
public Predicate<String> computeValue() {
return t -> t.length() > prop.get().length() ;
}
}
);
Вы также можете использовать метод Bindings.createBinding()
, который принимает Callable<Predicate<String>>
и список наблюдаемых для наблюдения (и, если они недействительны, пересчитайте):
filteredList.predicateProperty().bind(Bindings.createObjectBinding(
// Callable<Predicate<String>> expressed as a lambda: () -> Predicate<String>
() ->
// Predicate<String> expressed as a lambda: String -> boolean
t -> t.length() > prop.get().length(),
prop
));
Без комментариев это сводится к краткому (но ошеломляющему)
filteredList.predicateProperty().bind(Bindings.createObjectBinding(
() -> t -> t.length() > prop.get().length(),
prop
));
Вот полный пример:
import static javafx.beans.binding.Bindings.createObjectBinding;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.collections.transformation.FilteredList;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class FilteredListExample extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
ObservableList<String> baseList = FXCollections.observableArrayList("a", "aa", "aaa", "b", "bb", "bbb");
FilteredList<String> filteredList = new FilteredList<>(baseList);
ListView<String> listView = new ListView<>(filteredList);
TextField input = new TextField();
filteredList.predicateProperty().bind(createObjectBinding(
() -> t -> t.length() >= input.getText().length(),
input.textProperty()));
BorderPane root = new BorderPane(listView, input, null, null, null) ;
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) { Application.launch(args); }
}