先月はGUIには直接関連のないプロパティとバインドについて紹介しました。今月から、再びGUI関連の話題に戻ります。

 今までコントロールなどを使用してGUIを構成するサンプルをいろいろと作成してきました。しかし、サンプルに含まれるにも関わらず、説明を省いてきた部分があります。それがコンテナとレイアウトです。

 コンテナは複数のノードを貼るためのノードです。一方、コンテナに貼るノードの配置をおこなうのがレイアウトになります。

 Swingではコンテナの機能とレイアウトの機能は分割されており、それぞれjava.awt.Containerクラス、java.awt.LayoutManagerインタフェースで表します。これに対し、JavaFXではコンテナにレイアウト機能が含まれています。

 そこで、今月と来月で、コンテナとレイアウトについてご紹介します。

 今月使用するサンプルは以下のリンクからダウンロードできます。

サンプルのプロジェクト (こちらからダウンロードできます)

ノードのサイズ

 レイアウトの機能を紹介する前に、レイアウトには必須の情報であるノードのサイズについて説明することにしましょう。とはいうものの、ノードのサイズを直接指定することはできません。サイズを決めるのはレイアウト機能だからです。

 ノードでできることはレイアウト機能に対して、サイズを決めるための情報を与えることだけです。

 ノードで指定できるサイズを決めるための情報には次の3種類があります。

  • 最小サイズ minWidth、minHeight
  • 推奨サイズ prefWidth、prefHeight
  • 最大サイズ maxWidth、maxHeight

 レイアウトの種類によっては推奨サイズをそのまま使用するものもありますし、使用しないこともあります。また、推奨サイズを使用していたとしても、ステージのリサイズに伴って推奨サイズから外れてしまうこともあります。

 ただし、ほとんどのレイアウトで最小サイズと最大サイズは守られます。つまり、リサイズして縮小した場合でも最小サイズより小さくなることはありません。同様に、拡大しても最大サイズより大きくなることはありません。

 ところが、NodeクラスはprefWidthやpreHeightなどのプロパティを定義していません。とはいうもののコントロールやコンテナはすべてprefWidthやprefHeightなどのプロパティが使用可能です。幅と高さをまとめて設定するsetPrefSize/setMinSize/setMaxSizeメソッドも定義されています。

 また、ButtonクラスやLabelクラスなどは、表示する文字列などから最小サイズ、推奨サイズおよび最大サイズが自動的に設定されます。もちろん、再設定することも可能です。