Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可以在JavaFX中创建动态绑定吗? 让我们考虑下面的情况。有一个窗格parentPane和窗格firstChildPane、secondChildPane、thirdChildPane…。子窗格将添加到父窗格。考虑到子窗格可以不受任何限制和以任何顺序动态添加和删除,如何使父窗格仅在这种情况下可见(如果任何子窗格可见)。当然,childPane的可见状态也可以随时更改。是否可以创建动态绑定。或者,为了能够在其中动态添加/删除子visible属性?如果是的话,怎么办?如果没有,那么在这种情况下使用什么解决方案?_Java_Javafx - Fatal编程技术网

可以在JavaFX中创建动态绑定吗? 让我们考虑下面的情况。有一个窗格parentPane和窗格firstChildPane、secondChildPane、thirdChildPane…。子窗格将添加到父窗格。考虑到子窗格可以不受任何限制和以任何顺序动态添加和删除,如何使父窗格仅在这种情况下可见(如果任何子窗格可见)。当然,childPane的可见状态也可以随时更改。是否可以创建动态绑定。或者,为了能够在其中动态添加/删除子visible属性?如果是的话,怎么办?如果没有,那么在这种情况下使用什么解决方案?

可以在JavaFX中创建动态绑定吗? 让我们考虑下面的情况。有一个窗格parentPane和窗格firstChildPane、secondChildPane、thirdChildPane…。子窗格将添加到父窗格。考虑到子窗格可以不受任何限制和以任何顺序动态添加和删除,如何使父窗格仅在这种情况下可见(如果任何子窗格可见)。当然,childPane的可见状态也可以随时更改。是否可以创建动态绑定。或者,为了能够在其中动态添加/删除子visible属性?如果是的话,怎么办?如果没有,那么在这种情况下使用什么解决方案?,java,javafx,Java,Javafx,您可以尝试以下方法: // list that fires updates if any members change visibility: ObservableList<Node> children = FXCollections.observableArrayList(n -> new Observable[] {n.visibleProperty()}); // make the new list always contain the same element

您可以尝试以下方法:

// list that fires updates if any members change visibility:
ObservableList<Node> children = 
    FXCollections.observableArrayList(n -> new Observable[] {n.visibleProperty()});
// make the new list always contain the same elements as the pane's child list:
Bindings.bindContent(children, parentPane.getChildren());
// filter for visible nodes:
ObservableList<Node> visibleChildren = children.filter(Node::isVisible);
// and now see if it's empty:
BooleanBinding someVisibleChildren = Bindings.isNotEmpty(visibleChildren);
// finally:
parentPane.visibleProperty().bind(someVisibleChildren);

您可以尝试以下方法:

// list that fires updates if any members change visibility:
ObservableList<Node> children = 
    FXCollections.observableArrayList(n -> new Observable[] {n.visibleProperty()});
// make the new list always contain the same elements as the pane's child list:
Bindings.bindContent(children, parentPane.getChildren());
// filter for visible nodes:
ObservableList<Node> visibleChildren = children.filter(Node::isVisible);
// and now see if it's empty:
BooleanBinding someVisibleChildren = Bindings.isNotEmpty(visibleChildren);
// finally:
parentPane.visibleProperty().bind(someVisibleChildren);

查看:相关:。查看:相关:。现在轮到我评论“一旦列表绑定到ObservableList,就不能再直接更改该列表。这样做会导致意外结果。”,所以
bindContentBidirectional
似乎是一个更安全的选择…@sillyfly但是
children
不会在这里直接更改(很容易将其设置为局部变量,或者以其他方式封装它,所以不能直接更改)嗯。。。我没有意识到这是另一种方式!这似乎有点违反直觉,不可观察列表“绑定”到可观察列表(因此可观察列表是可以安全更改的列表),但我想这是唯一有意义的方法。@sillyfly我总是不得不用这种方法暂停片刻,但是,是的,你只能绑定到可观察的东西,这决定了它的方向。(但无论哪种方式,您都希望
子对象
依赖于
parentPane.getChildren()
…)现在轮到我发表评论说“一旦列表绑定到可观察列表,就不能再直接更改该列表。这样做会导致意外的结果。”,所以
bindContentBidirectional
似乎是一个更安全的选择…@sillyfly但是
children
不会在这里直接更改(很容易将其设置为局部变量,或者以其他方式封装它,所以不能直接更改)嗯。。。我没有意识到这是另一种方式!这似乎有点违反直觉,不可观察列表“绑定”到可观察列表(因此可观察列表是可以安全更改的列表),但我想这是唯一有意义的方法。@sillyfly我总是不得不用这种方法暂停片刻,但是,是的,你只能绑定到可观察的东西,这决定了它的方向。(但无论哪种方式,您都希望
子对象
依赖于
parentPane.getChildren()
…)