区切り線が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やJLabel・JRadioButtonといったコンポーネントは、デフォルトでは境界線は描画されない。
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")); |
タイトル付きの枠を表示するボーダー。 枠線は他のボーダーを指定するのが普通だと思われる。 タイトルのフォントや位置を指定することも出来る。
|
||||||||||||||||||
![]() |
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);