torutkのブログ

ソフトウェア・エンジニアのブログ

JavaFX 2.0でアプリケーション作成(その2)

JavaFX 2.0でアプリケーション作成(その1) - torutkのブログの続きです。前回作成した画面は、レイアウトが左上にぎゅっとつまっているので、今回はセンタリング、間隔を調整します。

ボタン、ラベル、テキストフィールドの配置に使ったBorderPaneには、それぞれの領域に貼りつけた子ノード(GUI部品)の配置ポリシー(寄せ方)として次のデフォルト設定がされています。(Javadocに記載されています)

領域 配置ポリシー
TOP Pos.TOP_LEFT
LEFT Pos.TOP_LEFT
RIGHT Pos.TOP_RIGHT
CENTER Pos.CENTER
BOTTOM Pos.BOTTOM_LEFT

TOP領域に貼ったラベルが左端に寄ってしまったのは、BorderPaneのTOP領域がデフォルトでPos.TOP_LEFTが適用されていたからでした。

デフォルトの配置を変更するにはBorderLayout.setAlignmentメソッドを使用します。ただし、setAlignmentは各領域のデフォルトを変更するものではなく、BorderPaneに貼る子ノードに対する制約(コンストレイント)を指定するものです。コードは次のようになります。

        Label topLabel = new Label("Semaphoreへの操作とその結果");
        BorderPane.setAlignment(topLabel, Pos.CENTER);
        borderPane.setTop(topLabel);

setAlignmentは、staticメソッドで領域ではなく子ノードを引数に指定しています。setAlignmentを追加した結果、画面構成は次のようになります。

トップのラベルが中央詰めになりました。

【注記】
LabelクラスにもsetAlignmentメソッドがありますが(こちらはstaticではない)、これをつかってPos.CENTERを使用しても期待する結果になりません。LabelのalignmentをCENTERにすると、Labelの幅に対して文字列をセンタリングしますが、Labelの幅は文字列の長さから決まるので、CENTERにしてもLEFTにしてもほとんど変わりません。
文字列の長さ相当の幅を持つLabelをBorderPaneのTOP領域に左寄せで配置すれば、Label自体は文字列を中央寄せで表示するとしても画面全体では左寄せになってしまいます。

次に、トップのラベルがウィンドウタイトルバーおよび下側のコンポーネントと近接しているので、少し間隔をあけたいと思います。BorderPaneには、子コンポーネントごとに設定可能なコンストレイントとしてalignmentの他にmarginがあります。

        Label topLabel = new Label("Semaphoreへの操作とその結果");
        BorderPane.setAlignment(topLabel, Pos.CENTER);
        BorderPane.setMargin(topLabel, new Insets(6));
        borderPane.setTop(topLabel);

marginコンストレイントは、Insetsで指定します。Insetsはコンポーネントの上下左右の間隔を数値指定します。同じ値でよければ上述コードのように1つの引数で一気に指定可能ですが、4つの引数で上、右、下、左の順で個別に間隔を指定することもできます。

        BorderPane.setMargin(topLabel, new Insets(10, 4, 6, 4));     

Insetsについて、NetBeansなどで自動import文作成するときは、java.awtにも同じInsetの名前を持つクラスがあるので、javafx.geometryパッケージの方を使うように注意します。

marginを指定した画面を次に示します。

次は、GridPaneの調整の予定です。