gpt4 book ai didi

java - 绑定(bind)列表内节点的用户数据更改?

转载 作者:行者123 更新时间:2023-12-02 04:20:47 25 4
gpt4 key购买 nike

我正在构建一个 JavaFX 应用程序,其中有一个包含 10 个标签的 GridPane,用户可以在每次拖放时将对象分配给这些标签。我使用了节点的 userdata 属性,因此当用户将一个对象放到一个标签上时,它会将该对象设置为该标签的 userdata。

现在我想为按钮的disableProperty设置一个绑定(bind),以便仅当用户用数据“填充”所有这些标签时该按钮才会启用。我尝试了几种方法,最后我得到了这样的结果:

FilteredList<Node> emptySlots = gridPane.getChildren().filtered(node -> node.getUserData() == null);
SimpleListProperty<Node> listProperty = new SimpleListProperty<>(emptySlots);
BooleanProperty hasEmptySlots = new SimpleBooleanProperty();
hasEmptySlots.bind(not(listProperty.emptyProperty()));
button.disableProperty().bind(hasEmptySlots);

但遗憾的是,当标签的 userdata 属性更改时,emptySlots 列表似乎不会更新。我已经尝试寻找更新此列表的方法,但我只找到在创建列表时使用自己的类和自定义设置的 ObservableLists 的方法( from here ):

ObservableList<Model> masterData = FXCollections.observableArrayList<>(model ->
new Observable[]{model.statusProperty()});

但我这里没有这个选项。

有人知道如何实现这个吗?

最佳答案

使用an extractor可以使用 a mirror 来工作children的列表,但不幸的是 userData不存储在属性中(即它不是 Observable )。要执行您想要的操作,您必须使用不同的机制来存储用户的对象。

使用 userData 的替代方法,本着与您当前方法相同的精神,是使用 Nodeproperties 。这些属性存储在 ObservableMap<Object, Object> 中这意味着可以观察它们的变化。要使用此选项,您仍然需要使用提取器并镜像 children列表。

class Foo {

private static final String USER_OBJECT_KEY = "USER_OBJECT";

private final GridPane gridPane = ...;
private final Button button = ...;

Foo() {
ObservableList<Node> mirror = FXCollections.observableArrayList(
n -> new Observable[]{n.getProperties()}
);
Bindings.bindContent(mirror, gridPane.getChildren());
FilteredList<Node> filtered = mirror.filtered(
n -> !n.getProperties().containsKey(USER_OBJECT_KEY)
);
button.disableProperty(Bindings.isEmpty(filtered));
}

}

上面使用 Bindings.isEmpty(ObservableList) 而不是将可观察列表包装在 ListProperty 中.

您可能还需要考虑将此状态移至模型中。这样您就可以避免将应用程序的状态与 JavaFX GUI 对象耦合(模型应该对 View 一无所知)。

关于java - 绑定(bind)列表内节点的用户数据更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56636989/

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