讓我們考慮以下情況。有一個Pane parentPane
,並有Pane firstChildPane, secondChildPane, thirdChildPane ...
。子窗格添加到父窗格。我如何才能讓parentPane在只有在這種情況下才可見,如果任何子窗格是可見的,考慮到可以動態添加和刪除子窗格而沒有任何限制和以任何順序。當然childPane可見狀態也可以隨時更改。是否有可能創建動態Bindings.OR,以便我可以動態地向/從它添加/刪除子可視屬性?如果是,那麼如何?如果不是,那麼在這種情況下使用什麼解決方案?是否有可能在JavaFX中創建動態Bindings.OR?
回答
您可以嘗試大意如下的內容:
// 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);
另一種方法是創建自己的BooleanBinding
直接:
Pane parentPane = ... ;
BooleanBinding someVisibleChildren = new BooleanBinding() {
{
parentPane.getChildren().forEach(n -> bind(n.visibleProperty()));
parentPane.getChildren().addListener((Change<? extends Node> c) -> {
while (c.next()) {
c.getAddedSubList().forEach(n -> bind(n.visibleProperty()));
c.getRemoved().forEach(n -> unbind(n.visibleProperty())) ;
}
});
bind(parentPane.getChildren());
}
@Override
public boolean computeValue() {
return parentPane.getChildren().stream()
.filter(Node::isVisible)
.findAny()
.isPresent();
}
}
parentPane.visibleProperty().bind(someVisibleChildren);
現在輪到我發表評論[您正在使用的工廠方法](https://docs.oracle.com/javase/8/javafx/api/javafx/beans/binding/Bindings.html#bindContent-java。 util.List-javafx.collections.ObservableList-)states「一旦一個List綁定到一個ObservableList,該List不能直接被改變,這樣做會導致意想不到的結果。」,所以'bindContentBidirectional'似乎是一個更安全的選擇... – Itai
@sillyfly但是'children'不會直接在這裏改變(很容易使它成爲局部變量,否則封裝它,所以不能直接更改) –
呃...我沒有意識到這是相反的方式!這似乎有點反直覺,它是不可觀察的列表被「綁定」到可觀察的列表(因此可觀察的列表是可以安全地更改的列表),但我想這是唯一有意義的方法。 – Itai
- 1. 是否有可能在Rails 4中動態創建實例?
- 2. 是否有可能在laravel 5中創建動態遷移
- 3. 是否有可能在JSF中創建靜態枚舉對象?
- 4. 是否有可能使用jQuery檢查元素是否是動態創建的?
- 5. 是否有可能在as2代碼中創建補間動畫
- 6. 是否有可能在Hyperion Planning表單中創建動態下拉框
- 7. 是否有可能在VisualStudio 2015中用動態代碼創建代碼片段
- 8. 是否可以動態創建ng-grid?
- 9. 是否可以動態創建htmlhelpers?
- 10. 是否可以動態創建源集?
- 11. 是否有可能創建一個動態日曆只能使用html和css
- 12. 是否有可能重新創建JVM?
- 13. 是否有可能在Struts2中的tiles.xml中有動態值
- 14. 是否有可能爲Java中的枚舉創建動態代理?
- 15. 是否有可能改變場動態
- 16. 是否可以創建動態嵌入功能?
- 17. 是否有可能在Firebird中創建私有存儲過程?
- 18. 是否有可能在Android中創建沒有xml的視圖?
- 19. 是否可以在JavaFX中創建一個控制器數組?
- 20. 是否可以在PostgreSQL中動態創建字典?
- 21. 是否可以在S3中創建動態用戶權限?
- 22. 是否可以在.NET 4中動態創建路由?
- 23. 是否可以在OSworkflow中動態創建WorkFlow?
- 24. 是否可以在數組中創建動態數量的列?
- 25. 是否可以動態創建WorkFlow(在Workflow-foundation -4中)?
- 26. 是否可以在Chrome中創建動態主題?
- 27. 是否可以在SQL PIVOT中使用動態創建的值?
- 28. 是否可以在scrapy中動態創建管道?
- 29. 是否可以在d3中創建動態網格線圖?
- 30. 是否有可能在視圖中創建會話在asp.net mvc?
給看看:https://stackoverflow.com/questions/33185073 /如何觀察子節點的可見性 – Linuslabo
相關:[JavaFX中的多布爾綁定](https://stackoverflow.com/questions/32192963/multiple-boolean-binding-in -javafx)。 – jewelsea