gpt4 book ai didi

java - TornadoFX/JavaFX - 根据另一个可观察属性过滤可观察列表

转载 作者:行者123 更新时间:2023-12-01 18:07:52 30 4
gpt4 key购买 nike

我在使用 TorandoFX 找出相对简单的过滤配置时遇到一些困难。我想创建一个基于 SimpleStringPropertyFilteredList (由 ObservableList 支持)。过滤操作应该“绑定(bind)”到字符串属性,以便对该属性的任何更新都会自动重新执行过滤操作。

例如,假设我想根据字符串属性的 length 过滤列表,以便 FilteredList 中的所有元素的 length >=字符串属性。以下内容无效。

val prop = SimpleStringProperty()
val baseList = listOf("a", "aa", "aaa", "b", "bb", "bbb")
val filteredList = FilteredList(baseList){ t -> prop.length().lessThanOrEqualTo(t.length).get()}

我将此界面连接到 GUI 中,但当我在文本字段中键入内容(绑定(bind)到 SimpleStringProperty)时,组合框(绑定(bind)到 filteredList)不会改变。

如何让这段代码工作?

最佳答案

我不了解 Kotlin/TornadoFX,但这里有一个您(或其他人)可能能够翻译的 JavaFX 解决方案。

基本思想是创建 FilteredList并绑定(bind)其predicatePropertyPredicate这取决于适当的StringProperty 。有多种库方法可用于创建此类绑定(bind)。例如。你可以这样做:

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

}

关于java - TornadoFX/JavaFX - 根据另一个可观察属性过滤可观察列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60527806/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com