2011年11月3日木曜日

ScalaでSwingレイアウト(GridBagPanel編)

scala.swingでは、レイアウトのクラスとPanelが一つのクラスになっています。
GridBagPanelはGridBagLayoutとJPanelクラスが合わさったクラスです。
GridBagPanelはレイアウトの自由度がかなり高いクラスとなっており、これを利用すれば、おおよその画面レイアウトは実装できてしまうのではないでしょうか?

主な使い方は以下の通りです。
  1. GridBagPanelの基本的な仕組み
  2. GridBagPanelクラスの基本的な利用方法
  3. GridBagPanelの色々なレイアウトオプション

GridBagPanelの基本的な仕組み

GridBagPanelはその名が示すとおり、コンポーネントを格子状に配置するクラスです。
しかし、同じコンポーネントを格子状に配置するGridPanelと違い、最初に格子の数を指定するのではなく、あとから追加する形で格子を配置していきます。
最初にコンポーネントを配置した場合、そこは (0,0) となります。
(0, 0)

次に、配置したコンポーネントの下にコンポーネントを配置したとします。このコンポーネントの位置は (0,1) となります
(0, 0)
(0, 1)

さらに配置したコンポーネントの右にコンポーネントを配置したりできます。このときコンポーネントの位置は (1, 1) となります。
(0, 0)
(0, 1) (1, 1)

また複数の格子にコンポーネントをまたがらせたりすることもできます。

GridBagPanelクラスの基本的な利用方法

一番簡単な利用方法は
  1. GridBagPanelクラスを生成する
  2. pari2Constraints(Int, Int)メソッドからConstraintsオブジェクトを生成する
    pair2Constraints(Int, Int)メソッドは第1引数に配置したい位置のx座標(最小値:0) y座標(最小値:0) を指定することで対応するConstraintsオブジェクトを生成します。
  3. layoutプロパティに配置したいコンポーネントと生成したConstraintsオブジェクトのMapを追加する。
簡単なサンプルを作ってみました。

下記はソースになります。


もう少しScalaっぽく書くと

GridBagPanelの色々なレイアウトオプション

Constraintsクラスのメンバが指定できるオプションになります。
gridwidth, gridheight 名前から一つのセルの幅を決めるオプションと思いがち(?)ですが、複数のセルにまたがってコンポーネントを配置するときに、またがらせるセルの数を指定するオプションです。
HTMLでいうところのcolspan(gridwidth)、rowspan(gridheight)という感じでしょうか。
insets 配置したコンポーネントとセルの隙間を指定します。HTMLでいうところのpaddingみたいなもんでしょうか。ちなみに、insetsって「はめ込む」とか「挿入」という意味だそうです。
ipadx, ipady 配置したコンポーネントの幅と高さを指定できます。
fill 配置したコンポーネントがセルのサイズより小さい場合、横幅一杯(Horizontal)、高さ一杯(Vertical)またはセル一杯(Both)にコンポーネントを配置するかを指定できます。
デフォルトは一杯に配置させない(None)となっています。
anchor コンポーネントがセルより小さい場合に、セル状に配置する位置を決めます。配置位置はAnchorオブジェクトのメンバを利用して指定します。それぞれの位置関係はこんな感じです。
FirstLineStartPageStartFirstLineEnd
LineStartCenterLineEnd
LastLineStartPageEndLastLineEnd

見本として、Java TutorialのサンプルをScalaで書き換えてみました。
ソースはこちら

0 件のコメント:

コメントを投稿