- Java Swingにおける
javax.swing.border
パッケージの基本的な役割と重要性 Border
インターフェースと、ボーダーを簡単に生成できるBorderFactory
クラスの使い方LineBorder
やTitledBorder
など、主要なボーダーの種類ごとの特徴と具体的な実装方法CompoundBorder
を使って複数のボーダーを組み合わせ、より複雑で魅力的なデザインを実現する方法- GUIコンポーネントにボーダーを設定し、動的に変更するといった実践的なテクニック
はじめに: GUIを彩るjavax.swing.borderとは?
Java Swingを使ってGUIアプリケーションを開発する際、コンポーネントの配置や機能だけでなく、その見た目もユーザー体験を大きく左右する重要な要素です。javax.swing.border
パッケージは、まさにその「見た目」を強化するための強力なツールキットです。
このパッケージは、Swingコンポーネントの周囲に様々な種類の境界線(ボーダー)を描画するためのクラスとインターフェースを提供します。ボーダーは単なる飾りではありません。コンポーネントの領域を明確にしたり、関連する要素をグループ化したり、あるいはコンポーネント間に適切な余白(マージン)を設けたりと、GUIの分かりやすさや使いやすさを向上させる上で不可欠な役割を担います。
すべてのSwingコンポーネントの基底クラスであるJComponent
には、ボーダーを設定するためのsetBorder(Border border)
メソッドが用意されています。これにより、JButton
, JPanel
, JLabel
など、ほぼ全てのSwingコンポーネントに対して、これから紹介する多彩なボーダーを適用することが可能です。
ボーダー適用の基本: BorderFactoryで手軽に生成
個々のボーダークラスをnew
キーワードで直接インスタンス化することも可能ですが、SwingではBorderFactory
クラスを使用することが推奨されています。このファクトリクラスは、様々な種類のボーダーオブジェクトを生成するための静的メソッドを提供しており、より簡潔で分かりやすいコードを書くことができます。
例えば、黒い実線のボーダーを作成する場合、以下のように書くことができます。
このように、BorderFactory
を使うことで、コードの意図が明確になり、IDEの補完機能も活用しやすくなります。この記事でも、以降はBorderFactory
を使った方法を基本として解説を進めていきます。
主要なボーダーの種類と使い方を徹底解説
javax.swing.border
パッケージには、様々な用途に応じたボーダークラスが用意されています。ここでは、特によく使われる主要なボーダーについて、その特徴と使い方をサンプルコードとともに詳しく見ていきましょう。
1. EmptyBorder: 余白を作るための透明なボーダー
EmptyBorder
は、その名の通り「空」のボーダーです。何も描画しませんが、コンポーネントの周囲に指定したサイズの余白(インセット)を作り出します。コンポーネント間のパディングやマージンを調整するのに非常に便利です。
import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
public class EmptyBorderExample { public static void main(String[] args) { JFrame frame = new JFrame("EmptyBorder Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300, 200); frame.setLayout(new FlowLayout(FlowLayout.CENTER, 20, 20)); JPanel panel = new JPanel(); panel.setBackground(Color.LIGHT_GRAY); // 上に10, 左に20, 下に10, 右に20ピクセルの余白を作成 Border emptyBorder = BorderFactory.createEmptyBorder(10, 20, 10, 20); panel.setBorder(emptyBorder); panel.add(new JLabel("このパネルにはEmptyBorderが設定されています")); frame.add(panel); frame.setVisible(true); }
}
2. LineBorder: シンプルな直線ボーダー
LineBorder
は、指定した色と太さの直線でコンポーネントを囲みます。最もシンプルで使いやすいボーダーの一つです。角を丸くすることも可能です。
import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
public class LineBorderExample { public static void main(String[] args) { JFrame frame = new JFrame("LineBorder Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(400, 200); frame.setLayout(new GridLayout(1, 2, 10, 10)); JLabel label1 = new JLabel("標準のLineBorder", SwingConstants.CENTER); // 赤色、太さ2ピクセルの線 label1.setBorder(BorderFactory.createLineBorder(Color.RED, 2)); JLabel label2 = new JLabel("角丸のLineBorder", SwingConstants.CENTER); // 青色、太さ3ピクセル、角を丸くする label2.setBorder(BorderFactory.createLineBorder(Color.BLUE, 3, true)); frame.add(label1); frame.add(label2); frame.setVisible(true); }
}
3. EtchedBorder: 彫り込み風ボーダー
EtchedBorder
は、コンポーネントが彫り込まれているか、あるいは浮き出て見えるような立体的な効果を生み出します。EtchedBorder.RAISED
(浮き彫り)とEtchedBorder.LOWERED
(彫り込み)の2つのスタイルがあります。
import javax.swing.*;
import javax.swing.border.EtchedBorder;
import java.awt.*;
public class EtchedBorderExample { public static void main(String[] args) { JFrame frame = new JFrame("EtchedBorder Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(400, 200); frame.setLayout(new GridLayout(1, 2, 10, 10)); JLabel label1 = new JLabel("LOWERED (彫り込み)", SwingConstants.CENTER); label1.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED)); JLabel label2 = new JLabel("RAISED (浮き彫り)", SwingConstants.CENTER); label2.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED)); frame.add(label1); frame.add(label2); frame.setVisible(true); }
}
4. BevelBorder: 立体的な斜角ボーダー
BevelBorder
も立体的な効果を持つボーダーで、EtchedBorder
よりもはっきりとした斜角(ベベル)が特徴です。こちらもBevelBorder.RAISED
とBevelBorder.LOWERED
のスタイルがあります。
import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.*;
public class BevelBorderExample { public static void main(String[] args) { JFrame frame = new JFrame("BevelBorder Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(400, 200); frame.setLayout(new GridLayout(1, 2, 10, 10)); JButton button1 = new JButton("RAISED Bevel"); button1.setBorder(BorderFactory.createRaisedBevelBorder()); JButton button2 = new JButton("LOWERED Bevel"); button2.setBorder(BorderFactory.createLoweredBevelBorder()); frame.add(button1); frame.add(button2); frame.setVisible(true); }
}
補足: SoftBevelBorder
というクラスもあり、これは角が少し丸くなった、より柔らかな印象の斜角ボーダーを作成します。
5. TitledBorder: タイトル付きボーダー
TitledBorder
は、他のボーダーと組み合わせて、その外側にテキストのタイトルを表示することができる非常に便利なボーダーです。関連するUI要素をグループ化し、そのグループに名前を付けるのに最適です。
タイトルの表示位置(Justification)や、ボーダー上のどこに配置するか(Position)も細かく指定できます。
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.TitledBorder;
import java.awt.*;
public class TitledBorderExample { public static void main(String[] args) { JFrame frame = new JFrame("TitledBorder Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(500, 300); JPanel panel = new JPanel(); panel.setLayout(new GridLayout(2, 2, 5, 5)); // 基準となるボーダーを作成 Border etched = BorderFactory.createEtchedBorder(); // TitledBorderを作成 TitledBorder titled = BorderFactory.createTitledBorder(etched, "ユーザー情報"); // タイトルの文字色とフォントを設定 titled.setTitleColor(Color.BLUE); titled.setTitleFont(new Font("メイリオ", Font.BOLD, 14)); // タイトルを中央に配置 titled.setTitleJustification(TitledBorder.CENTER); panel.setBorder(titled); panel.add(new JLabel("名前:")); panel.add(new JTextField()); panel.add(new JLabel("メールアドレス:")); panel.add(new JTextField()); frame.add(panel, BorderLayout.CENTER); // パネルの周りに余白を追加 frame.getRootPane().setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); frame.setVisible(true); }
}
応用編: CompoundBorderでボーダーを組み合わせる
Swingのボーダーシステムの強力な機能の一つが、CompoundBorder
です。これは、2つのボーダーを「外側のボーダー(outside)」と「内側のボーダー(inside)」として組み合わせ、一つの新しいボーダーを作成することができます。
これにより、非常に柔軟で複雑なデザインを実現できます。例えば、「タイトル付きボーダーの外側にさらに余白を追加したい」といったケースで威力を発揮します。
以下の例では、TitledBorder
の外側にEmptyBorder
を配置して、ウィンドウの端から少し離れた位置にグループボックスをレイアウトしています。
さらに、CompoundBorder
自体もボーダーの一種なので、CompoundBorder
を入れ子にすることで、3つ以上のボーダーを組み合わせることも可能です。
まとめ
この記事では、Java Swingのjavax.swing.border
パッケージについて、その基本的な役割から主要なボーダーの種類、そして応用的な使い方までを詳しく解説しました。
シンプルな余白を作るEmptyBorder
、基本的な線を描くLineBorder
、立体感を出すEtchedBorder
やBevelBorder
、そして要素を明確にグループ化するTitledBorder
。これらの基本的なボーダーを理解し、BorderFactory
で手軽に生成することから始めましょう。
そして、CompoundBorder
による組み合わせをマスターすれば、デザインの可能性は大きく広がります。この記事で紹介した知識とサンプルコードを参考に、ぜひあなたのSwingアプリケーションをより魅力的で使いやすいものにしてください。