torutkのブログ

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

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

JavaFX 2.0でアプリケーション作成(その3) - torutkのブログ
の続きです。前回は、GridPaneの各Grid間隔を指定しました。
今回は、ボタンの大きさを揃えます。

ボタンの大きさは、ボタンに設定した文字列の長さに基づいています。JavaFX 2では、AWT/Swing同様、コントロールには最小/最大/推奨サイズがあります。

ボタンをはじめとするUIコントロールの基底クラスjavafx.scene.control.Controlクラスを見ると大きさに関して次のプロパティが定義されています。

プロパティ名
height double
width double
minHeight double
minWidth double
maxHeight double
maxWidth double
prefHeight double
prefWidth double

Buttonクラスの推奨サイズ(prefHeightとprefWidth)は、基本的にButtonに設定した文字列の長さによって決まり*1、最大サイズ(maxHeightとmaxWidth)は推奨サイズと同じに設定されます*2

GridPaneでは、同じ列の横幅は、もっとも長いコントロールに従います。ところが、ButtonはmaxWidthがprefWidthと同一なので、maxWidthよりGridPaneの格子の横幅が大きい場合、maxWidthを越えて引き伸ばされることはなく、格子内に(おそらく)デフォルトの左寄せで表示されます。

そこで、ButtonのmaxWidthをGridPaneの格子より大きな値にしておくことで、Buttonを格子一杯の大きさになるようにします。

コードは次のようになります。setMaxWidthメソッドで最大値をdoubleの最大にしておきます。

        Button tryButton = new Button("Try acquire");
        tryButton.setMaxWidth(Double.MAX_VALUE);
        semaphorePane.add(tryButton, 0, 1);

もう一つのボタンも同様に最大値を設定します。

        Button releaseButton = new Button("Release");
        releaseButton.setMaxWidth(Double.MAX_VALUE);
        semaphorePane.add(releaseButton, 0, 2);

この最大値を設定した結果、画面は次のようになりました。

この時点でなんとか見られる、とてもJavaFXらしからぬGUIが出来上がりました。
次回は、Semaphoreを操作するロジックを実装して、アプリケーションの初版を完成させます。

*1:Buttonには文字列だけでなくアイコン画像も設定できるので、アイコンを設定したときはその大きさも含めてサイズが設定される

*2:"Oracle JavaFX, Working with Layouts in JavaFX Release 2.0の2章 Tips for Sizing and Aligning Nodesより。http://docs.oracle.com/javafx/2.0/layout/size_align.htm