質問: javaFX でシステム開発をしています。 HBoxにLabelを動的に追加する処理があり 最終的にHBoxの幅がいくつになるか取得したいのですが getWidthすると必ず0になってしまいます。 Stage.showで描画した後であれば、取得できるのですが 描画前に取得することは不可能でしょうか? Labelの幅も動的に変わるので 計算せずに取得する方法はないでしょうか?
回答: 正確には「描画」する際に計算されるのではなく「レイアウトを確定する」際に計算されると思います。レイアウト結果が確定できるタイミングは多分「制約が全て設定された状態でノード階層が完成」していることが必要だろうと思います。 「HBoxの幅を事前に知る」目的が何かが明確にはわかりませんが、おそらく「その幅を用いてレイアウト制約を指定したいから」ではないかと思います。もしそうなら別のアプローチをとった方がよいかも知れません。「HBoxの幅がいくつであれ、その幅によって上位のコンテナや兄弟ノードの大きさが自動調整されるような制約の指定方法を考える」方がひょっとすると適切かも知れないと思います。しかし目的によって採るべき方法が変わりそうなのではっきりとは言えません。 なぜHBoxの幅を事前に知りたいのか目的をもう少し具体的に記載されてはいかがでしょう。それにより適切なアドバイスが付きやすくなる気がします。 極端な例でいえば、N項目のラベルと項目値をN×2の格子に配置するような場合、VBoxに複数のHBoxを並べHBoxの各ノードの幅を調べて最大のものに全ての横幅をそろえるなんてことを自前でやろうとしているなら、「GridPaneを用いる方が適切」というようなアドバイスがつくと思います。