1. ホーム
  2. javafx

[解決済み] JavaFXによるGridPane内のラベルの整列

2022-02-24 11:14:52

質問

Label.setAlignment(Pos.CENTER_RIGHT) を設定しても、GridPaneに追加されるラベルのアライメントに影響しないのはなぜでしょうか?このような場合、グリッド(ColumnConstraintsなど)を通して、または、右寄せのHBoxにラベルを追加する方法しかないようです。

ラベルのアライメントをCENTER_RIGHTに設定しても効果がないのはなぜですか?APIによると、"Labeled内に空のスペースがある場合に、Labeled内のテキストとグラフィックをどのように整列させるかを指定します。

どのように解決するのですか?

TL:DR版 の代わりに label.setAlignment(Pos.CENTER_RIGHT); 使用 GridPane.setHalignment(label, HPos.RIGHT); .

JavaFXでは、トップダウン方式のレイアウトを採用しています。そのため、シーンはルートノードをシーンのサイズに合わせ、ルートノードはレイアウト戦略とシーンが与えたスペースの量に応じて子ノードのサイズと位置を決め、各子ノードは自身のレイアウト戦略と利用できるスペースの量に応じて子ノードのサイズと位置を決め、そうしてシーングラフを下へ下へと進んでいきます。

のドキュメントによると Label は、その alignmentProperty

Labeled内のテキストやグラフィックが空いたときに、どのように整列させるかを指定します。

もちろん、ラベルが利用できるスペースの量は、その親(この場合、グリッドペイン)によって決定されます。グリッドペインのレイアウト戦略や設定方法については、グリッドペインの ドキュメント . 簡単に言えば、ですが。

デフォルトでは、グリッドペインは各ノードに好みのサイズを割り当て、配置されたセルに余分なスペースがある場合は、ノードをグリッドセルの左上に配置します。ラベルの好ましいサイズは、もちろん計算されたサイズであり、その内容を保持するのに十分な大きさです。したがって、単純にラベルをグリッドペインに配置し、ラベルのアライメントを設定しても、ラベルはそのコンテンツを保持するのに十分な大きさであり、テキストやグラフィックを配置するための余分なスペースがないため、何の効果もないことがわかります。このことは、ラベルに背景色やボーダーを配置することで視覚化することができます。

そこで、ラベルのアライメントを CENTER_RIGHT そして、グリッドペインにラベルを成長させるように指示します。まず、セルの幅いっぱいにラベルを表示するようにグリッドペインに指示します。

GridPane.setFillWidth(label, true);

で、グリッドペインは子ノードの最大サイズを尊重し、ラベルはデフォルトでその好ましいサイズを最大サイズとして使用するので、ラベルが成長することを許可します。

label.setMaxWidth(Double.MAX_VALUE);

そうすると、ラベルはセルの大きさに合わせて大きくなるので、さらに

label.setAlignment(Pos.CENTER_RIGHT);

は、それ自身のコンテンツを右寄せにします。

より賢明な方法は、グリッドペインにセル内のラベルをどのように配置するかを指示することでしょう。

GridPane.setHalignment(label, HPos.RIGHT);

そして、ラベルにデフォルトのサイズとアライメントを適用させれば、すべてがうまくいくでしょう。

また ColumnConstraints オブジェクトを使用して、特定の列のすべてのラベルのデフォルトアライメントを設定することができます。