2017-09-13 14 views
1

以下のような状況を考えてみましょう。 Pane parentPaneがあり、Pane firstChildPane, secondChildPane, thirdChildPane ...があります。親ペインに子ペインが追加されます。どのように子ペインが表示されても、その子ペインが制限なく任意の順序で追加および削除できることを考慮して、parentPaneを表示させるにはどうすればよいですか。もちろんchildPaneの可視状態もいつでも変更できます。動的にBindings.ORを作成して、子の可視プロパティを動的に追加/削除できるようにすることは可能ですか?はいの場合は、どうですか?そうでない場合は、そのような場合にどのような解決法が使われますか?JavaFXで動的Bindings.ORを作成することは可能ですか?

+0

を見て与える:https://stackoverflow.com/questionsを

// 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を作成することです/ 33185073 /子ノードの可視性の観察 – Linuslabo

+0

関連項目:[JavaFXでの複数ブール代入](https://stackoverflow.com/questions/32192963/multiple-boolean-binding-in) -javafx)。 – jewelsea

答えて

3

次の線に沿って何かを試すことができます。

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); 
+0

これで、[使用しているファクトリメソッド](https://docs.oracle.com/javase/8/javafx/api/javafx/beans/binding/Bindings.html#bindContent-java)にコメントすることになりました。 util.List-javafx.collections.ObservableList-)は、「リストがObservableListにバインドされると、リストを直接変更することはできません。そうすることで予期しない結果につながる」と述べています。したがって、 'bindContentBidirectional'はより安全な選択肢のようです... – Itai

+0

@sillyflyしかし、ここでは 'children'を直接変更することはできません(ローカル変数にしたり、カプセル化して直接変更することはできません) –

+0

ああ...それは他の方法であることに気づいた!これは、観察可能なものに「束縛」される観測不可能なリストである(そして観察可能なものは安全に変更できるものです)が、直感的ではないようですが、それは意味をなさない唯一の方法だと思います。 – Itai

関連する問題