JavaFX-setVisibleは要素を非表示にしますが、隣接するノードを再配置しません


83

JavaFXで、2つのVBox要素を持つシーンがあり、それぞれVBoxに複数の要素Labelがある場合。
私はトップを設定した場合VBoxは見えない、なぜ底がありませんVBox 、トップVBoxがあったシーンでが上に移動しですか?

ザ・ VBoxある目に見えないが、私は他のオブジェクトがその場所に移動することが期待されます。

FXMLを使用してコントロールをロードしています。


2
最初のものVBoxは単に見えずremoved、その親からではないからです。
ItachiUchiha 2015

1
隠れノードがスペースを占めるかどうかは、通常、レイアウトの決定です
kleopatra 2015

回答:


165

Node.setVisible(boolean)の可視性状態を切り替えるだけNodeです。

Node親のレイアウト計算からを除外するには、を呼び出して、管理状態を設定する必要がありますNode.setManaged(false)

可視性とともに管理状態を自動的に更新する場合は、@ jewelseaが指摘したようにバインディングを使用できます。 node.managedProperty().bind(node.visibleProperty());


49
また作品結合、例えば、node.managedProperty().bind(node.visibleProperty());
jewelsea

これは素晴らしい!Adobe / Apache Flexから来たのでincludeInlayoutトグル(ここでも同じことをします)が本当にありませんでした。Flexにはまだより直感的な名前がありますが、これを簡単に実行できるのは素晴らしいことです。
ユーザー

1
あまりにも長い間、親から目に見えない要素を削除してきました。これにより、将来的に多くの時間を節約できます。
hanslovsky

7

見えないので上に移動しません。次のような方法で削除する必要があります。

// remove
vbox.getChildren().remove(...)

非表示にする要素を削除すると、他の要素が一番上に移動します。


3
AFAIK、シーングラフの操作は、visibleをfalseに設定するよりもコストがかかります。
ピュース2017

2

vboxを非表示にする代わりに、子から削除する必要があります。もう一度表示する場合は、vboxを再度追加します。


1

setVisibleとmanagedPropertyを一緒に使用してみてください。次に例を示します。

myHBox.setVisible(false);
myHBox.managedProperty().bind(myHBox.visibleProperty());

1
最も賛成票を投じた回答と比較して新しいことは何もありません:)
kleopatra19年

0

ノードを非表示にしたり再表示したりする場合は、ノードのサイズを0に変更します。そうすれば、ノードはユーザーに表示されないためスペースを占有しません。したがって、ノードを表示したい場合は、サイズを再度調整して表示します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.