GridBagPanelはGridBagLayoutとJPanelクラスが合わさったクラスです。
GridBagPanelはレイアウトの自由度がかなり高いクラスとなっており、これを利用すれば、おおよその画面レイアウトは実装できてしまうのではないでしょうか?
主な使い方は以下の通りです。
GridBagPanelの基本的な仕組み
GridBagPanelはその名が示すとおり、コンポーネントを格子状に配置するクラスです。
しかし、同じコンポーネントを格子状に配置するGridPanelと違い、最初に格子の数を指定するのではなく、あとから追加する形で格子を配置していきます。
最初にコンポーネントを配置した場合、そこは (0,0) となります。
次に、配置したコンポーネントの下にコンポーネントを配置したとします。このコンポーネントの位置は (0,1) となります
さらに配置したコンポーネントの右にコンポーネントを配置したりできます。このときコンポーネントの位置は (1, 1) となります。
また複数の格子にコンポーネントをまたがらせたりすることもできます。
しかし、同じコンポーネントを格子状に配置するGridPanelと違い、最初に格子の数を指定するのではなく、あとから追加する形で格子を配置していきます。
最初にコンポーネントを配置した場合、そこは (0,0) となります。
(0, 0) |
次に、配置したコンポーネントの下にコンポーネントを配置したとします。このコンポーネントの位置は (0,1) となります
(0, 0) |
(0, 1) |
さらに配置したコンポーネントの右にコンポーネントを配置したりできます。このときコンポーネントの位置は (1, 1) となります。
(0, 0) | |
(0, 1) | (1, 1) |
また複数の格子にコンポーネントをまたがらせたりすることもできます。
GridBagPanelクラスの基本的な利用方法
一番簡単な利用方法は
下記はソースになります。
もう少しScalaっぽく書くと
- GridBagPanelクラスを生成する
- pari2Constraints(Int, Int)メソッドからConstraintsオブジェクトを生成するpair2Constraints(Int, Int)メソッドは第1引数に配置したい位置のx座標(最小値:0) y座標(最小値:0) を指定することで対応するConstraintsオブジェクトを生成します。
- layoutプロパティに配置したいコンポーネントと生成したConstraintsオブジェクトのMapを追加する。
下記はソースになります。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.awt.Dimension | |
import scala.swing._ | |
object SimpleGridBag extends SimpleSwingApplication { | |
val buttonList = "Blogger"::"はてな"::"FC2"::Nil | |
val top = new MainFrame { | |
val bagPanel = new GridBagPanel(); | |
for (i <- 0 to (buttonList.length - 1)) { | |
val constraints = bagPanel.pair2Constraints(i, 0) | |
val button = new Button(buttonList(i)) | |
bagPanel.layout += button -> constraints | |
} | |
contents = bagPanel | |
} | |
} |
もう少しScalaっぽく書くと
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.awt.Dimension | |
import scala.swing._ | |
object SimpleGridBag extends SimpleSwingApplication { | |
val buttonList = "Blogger"::"はてな"::"FC2"::Nil | |
val top = new MainFrame { | |
contents = new GridBagPanel() { | |
for (i <- 0 to (buttonList.length - 1)) { | |
val constraints = pair2Constraints(i, 0) | |
val button = new Button(buttonList(i)) | |
layout += button -> constraints | |
} | |
} | |
} | |
} |
GridBagPanelの色々なレイアウトオプション
Constraintsクラスのメンバが指定できるオプションになります。
見本として、Java TutorialのサンプルをScalaで書き換えてみました。
ソースはこちら
gridwidth, gridheight | 名前から一つのセルの幅を決めるオプションと思いがち(?)ですが、複数のセルにまたがってコンポーネントを配置するときに、またがらせるセルの数を指定するオプションです。 HTMLでいうところのcolspan(gridwidth)、rowspan(gridheight)という感じでしょうか。 | |||||||||
insets | 配置したコンポーネントとセルの隙間を指定します。HTMLでいうところのpaddingみたいなもんでしょうか。ちなみに、insetsって「はめ込む」とか「挿入」という意味だそうです。 | |||||||||
ipadx, ipady | 配置したコンポーネントの幅と高さを指定できます。 | |||||||||
fill | 配置したコンポーネントがセルのサイズより小さい場合、横幅一杯(Horizontal)、高さ一杯(Vertical)またはセル一杯(Both)にコンポーネントを配置するかを指定できます。 デフォルトは一杯に配置させない(None)となっています。 | |||||||||
anchor | コンポーネントがセルより小さい場合に、セル状に配置する位置を決めます。配置位置はAnchorオブジェクトのメンバを利用して指定します。それぞれの位置関係はこんな感じです。
|
見本として、Java TutorialのサンプルをScalaで書き換えてみました。
ソースはこちら
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.awt.Dimension | |
import scala.swing._ | |
object GridBagPanelDemo extends SimpleSwingApplication { | |
val top = new MainFrame() { | |
contents = new GridBagPanel() { | |
layout += new Button("Button 1") -> pair2Constraints(0, 0) | |
layout += new Button("Button 2") -> pair2Constraints(1, 0) | |
layout += new Button("Button 3") -> pair2Constraints(2, 0) | |
/** 横幅一杯に配置する**/ | |
val c4 = pair2Constraints(0, 1) | |
// 3列にまたがってコンポーネントを配置する | |
c4.gridwidth = 3 | |
c4.fill = GridBagPanel.Fill.Horizontal | |
// コンポーネントの高さを高くする | |
c4.ipady = 40 | |
layout += new Button("Long-Named Button 4") -> c4 | |
/** 右寄り2列に配置する **/ | |
val c5 = pair2Constraints(1, 2) | |
// 2列にまたがってコンポーネントを配置する | |
c5.gridwidth = 2; | |
c5.fill = GridBagPanel.Fill.Horizontal | |
c5.anchor = GridBagPanel.Anchor.PageEnd | |
// セル上部にパディング | |
c5.insets = new Insets(10, 0, 0, 0) | |
layout += new Button("5") -> c5 | |
} | |
} | |
} |
0 件のコメント:
コメントを投稿