gridPane
コードでは一度反復するだけなので、子リストは固定されていると想定します。
まず、各子をその にバインド してみませんか?managedProperty
visibleProperty
gridPane.getChildren().stream().forEach(c -> {
c.managedProperty().bind(c.visibleProperty());
});
子の可視性が変更されたときに通知を受け取るには、単一の を作成して観察できますEventStream
。
LiveList.map(gridPane.getChildren(), c -> EventStreams.valuesOf(c.visibleProperty()))
.reduce((es1, es2) -> EventStreams.merge(es1, es2))
.orElseConst(EventStreams.never()) // for the case of no children
.values().flatMap(Function.identity())
.subscribe(b -> primaryStage.sizeToScene());
子リストは固定されていると想定しているため、もう少し単純なもので問題を解決できます。
gridPane.getChildren().stream().map(c -> EventStreams.valuesOf(c.visibleProperty()))
.reduce((es1, es2) -> EventStreams.merge(es1, es2))
.orElse(EventStreams.never()) // for the case of no children
.subscribe(b -> primaryStage.sizeToScene());
とはいえ、改ざんされない解決策を見つけることを検討しmanagedProperty
ます。
編集:たとえば、可視プロパティで子のリストをフィルタリングします。
// your (fixed) list of children
List<Node> children0 = ...;
// list of children that triggers list changes when children change their visibility
ObservableList<Node> children = FXCollections.observableList(
children0, ch -> new Observable[]{ ch.visibleProperty() });
// children filtered by visibility
ObservableList<Node> visibleChildren = children.filtered(Node::isVisible);
// bind GridPane's children to visible children
Bindings.bindContent(gridPane.getChildren(), visibleChildren);
visibleChildren
JavaFX では弱いリスナーが使用されているため、ガベージ コレクションを防ぐために参照を格納する必要がある場合があります。