S-JIS[2009-04-07/2009-04-11] 変更履歴

セパレーター・ボックス・ボーダー(Swing)

区切り線がJSeparator。(HTMLで言えば<hr>タグのようなもの)
四角形がBox(JComponentのくせして「J」が付いてない)。
各コンポーネントを囲む線(境界線)を描画するのがBorder


セパレーター

区切り線のコンポーネントがJSeparator。ただ単に(ちょっと陰影のついた)線。

import javax.swing.JSeparator;
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = frame.getContentPane();
		c.setLayout(new BoxLayout(c, BoxLayout.Y_AXIS));

		c.add(new JLabel("ラベル1"));
		c.add(new JSeparator(JSeparator.HORIZONTAL));	// 水平線
		c.add(new JLabel("ラベル2"));
		c.add(new JSeparator());	// デフォルトコンストラクターは水平線
		c.add(new JLabel("ラベル3"));

		frame.pack();
		frame.setVisible(true);

コンストラクターにJSeparator.VERTICALを指定すると垂直線。

ちなみに、メニュー(JMenu)でメニュー区切りの線を入れるにはJMenu#addSeparator()を使う。


JSeparatorは太さを指定できないので、太いセパレーターが欲しければ、ボックスにそれっぽいボーダーを指定すれば 近いものが出来るかも。[2009-04-11]

		JComponent sep4 = (JComponent) Box.createVerticalStrut(5);	//高さ固定で横に長い箱
		sep4.setBorder(new BevelBorder(BevelBorder.LOWERED));		//くぼみ陰影ボーダー
		c.add(sep4);
		c.add(new JLabel("ラベル4"));

ボックス

Boxは、四角形を表現するコンポーネント。ただし、四角形の線が表示されるわけではない。
実のところ、JPanelにBoxLayoutを指定したのとほぼ全く同じ。
ただし、コンストラクターでインスタンスを作る他に、BoxインスタンスやFillerインスタンスを作る為のstaticメソッドが用意されている。

import javax.swing.Box;
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = frame.getContentPane();

		// ボックス内で横に並ぶ
		Box box1 = Box.createHorizontalBox();
		box1.add(new JLabel("ラベル1"));
		box1.add(new JLabel("ラベル2"));
		c.add(box1, BorderLayout.NORTH);

		// ボックス内で縦に並ぶ
		Box box2 = Box.createHorizontalBox();
		box2.add(new JLabel("ラベル1"));
		box2.add(new JLabel("ラベル2"));
		c.add(box2, BorderLayout.CENTER);

		frame.pack();
		frame.setVisible(true);

内部に何も(別のコンポーネントを)保持しないボックス(Filler)も作れる。
何に使うかと言うと、他のコンポーネント同士の間隔を空けるのに使う。

例えば以下のコーディングでcreateGlue()をコンテナに追加するのとしないのとで、動作が異なる。(Glueは「接着剤」)
pack()しているので初期表示は同じ(各コンポーネントは推奨サイズになる。Glueはサイズ無し)になるが、
フレームサイズを広げてみると、Glueがある場合はテキストエリアの間に空白が広がるが、Glueが無いとテキストエリア同士がくっついたままになる。
(Glueもコンポーネントとして数えられるので、テキストエリア2つと合わせて3つのコンポーネントがそれぞれ均等に広がる)

		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = frame.getContentPane();
		c.setLayout(new BoxLayout(c, BoxLayout.Y_AXIS));

		c.add(new JScrollPane(new JTextArea()));
		c.add(Box.createGlue());
		c.add(new JScrollPane(new JTextArea()));

		frame.pack();
		frame.setVisible(true);

他にも、縦方向にしか伸縮しないcreateVerticalGlue()や横方向専用のcreateHorizontalGlue()
指定された高さ固定で横にしか伸縮しないcreateVerticalStrut(高さ)や幅固定で縦に伸縮するcreateHorizontalStrut(幅)等がある(Strutは「柱」だそうだ)。
絶対に伸縮しない一定領域を確保する為のcreateRigidArea(サイズ)というのもある。
フレームサイズを変更しても一定の空間・間隔(高さや幅)を確保したい場合に使える。


ボーダー

Borderは、コンポーネントの境界線の描画を行うもの。
JPanelやJLabelJRadioButtonといったコンポーネントは、デフォルトでは境界線は描画されない。
JComponent#setBorder()でBorderをセットすることにより、境界線が描画されるようになる。

import javax.swing.border.*;
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = frame.getContentPane();

		// スペースを確保する
		c.add(Box.createVerticalStrut(16), BorderLayout.NORTH);
		c.add(Box.createVerticalStrut(16), BorderLayout.SOUTH);
		c.add(Box.createHorizontalStrut(16), BorderLayout.WEST);
		c.add(Box.createHorizontalStrut(16), BorderLayout.EAST);

		// ラベルにボーダーを設定する
		JLabel label = new JLabel("サンプル");
		label.setBorder(ボーダーインスタンス);
		c.add(label);

		frame.pack();
		frame.setVisible(true);

Borderはインターフェースであり、様々な具象クラスがある。

クラス名 イメージ コーディング例 説明
EmptyBorder
label.setBorder(new EmptyBorder(0, 0, 0, 0));
線を描画しない。
数値はInsets。つまり上下左右の間隔を指定する。
LineBorder
label.setBorder(new LineBorder(Color.BLACK));
(普通の単なる)線を描画する。
第1引数は線の色。
第2引数は線の太さ。省略時は1。 0にすると線は描かれない。
(線の太さをアンバランスにしたいなら(!?)、MatteBorderを使うといいかも)
label.setBorder(new LineBorder(Color.BLACK, 4));
EtchedBorder
label.setBorder(new EtchedBorder());
label.setBorder(
  new EtchedBorder(EtchedBorder.LOWERED)
);
エッチな線を引く(爆)
デフォルト、あるいはLOWEREDを指定すると彫り込みエッチング(くぼむ)。
RAISEDを指定すると浮き彫りエッチング(盛り上がる)。
label.setBorder(
  new EtchedBorder(EtchedBorder.RAISED)
);
BevelBorder
label.setBorder(
  new BevelBorder(BevelBorder.LOWERED)
);
LOWEREDだとくぼみ射影ボーダー
RAISEDだと浮き出し射影ボーダー

HTMLっぽいテーブルを作る例
label.setBorder(
  new BevelBorder(BevelBorder.RAISED)
);
SoftBevelBorder
label.setBorder(
  new SoftBevelBorder(SoftBevelBorder.LOWERED)
);
角の丸い射影ボーダー。
LOWERED・RAISEDはBevelBorderと同様。
CompoundBorder
label.setBorder(new CompoundBorder(
  new BevelBorder(BevelBorder.RAISED),  //外側
  new BevelBorder(BevelBorder.LOWERED)  //内側
));
複合ボーダー。
複数のボーダーを組み合わせて描画する。
(2つのボーダーを外側と内側に表示する)

左の例では、LineBorderの代わりにEmptyBorderを使っても同様の表示になる。
label.setBorder(new CompoundBorder(
  new BevelBorder(BevelBorder.RAISED),	//一番外側
  new CompoundBorder(
    new LineBorder(frame.getBackground(), 2),
    new BevelBorder(BevelBorder.LOWERED)	//一番内側
  )
));
TitledBorder
label.setBorder(new TitledBorder("title"));
タイトル付きの枠を表示するボーダー。

枠線は他のボーダーを指定するのが普通だと思われる。

タイトルのフォントや位置を指定することも出来る。
Justification
LEFT CENTER RIGHT
中央
Position
ABOVE_TOP 上側の線の上
TOP 上側の線に乗る
BELOW_TOP 上側の線の下
ABOVE_BOTTOM 下側の線の上
BOTTOM 下側の線に乗る
BELOW_BOTTOM 下側の線の下
label.setBorder(
  new TitledBorder(new EtchedBorder(), "title")
);
label.setBorder(new TitledBorder(
  new EtchedBorder(),
  "title",
  TitledBorder.CENTER,
  TitledBorder.ABOVE_TOP
));
label.setBorder(new TitledBorder(
  new EtchedBorder(),
  "title",
  TitledBorder.RIGHT,
  TitledBorder.BELOW_BOTTOM,
  new Font("", Font.ITALIC, 12),
  Color.Red
));
MatteBorder
label.setBorder(
  new MatteBorder(4, 4, 4, 4, Color.RED)
);

飾り縁ボーダー。
Insetsと色を指定した場合はLineBorderと同じ感じ。

アイコンを指定した場合は、アイコンで縁取られる。

Insetsとアイコンを指定すると、そのサイズで囲まれる。
URL url = BorderSample.class.getResource("diamond.png");
label.setBorder(new MatteBorder(new ImageIcon(url)));
URL url = BorderSample.class.getResource("diamond.png");
label.setBorder(
  new MatteBorder(
    new Insets(4, 4, 4, 4), new ImageIcon(url)
  )
);

JPanelに浮き出し射影ボーダーを付けて 中のコンポーネントにくぼみ射影ボーダーを付けると、HTMLの<table>のような感じが出る。

		JPanel panel = new JPanel(new GridLayout(3, 2));
		panel.setBorder(new BevelBorder(BevelBorder.RAISED));
		for (int i = 0; i < 6; i++) {
			JLabel label = new JLabel("ラベル" + i);
			label.setBorder(new BevelBorder(BevelBorder.LOWERED));
			panel.add(label);
		}
		frame.getContentPane().add(panel);


Swing目次へ戻る / Java目次へ戻る
メールの送信先:ひしだま