Java Swingのjavax.swing.borderを徹底解説!GUIコンポーネントの見た目を自由自在に

この記事を読むことで、以下の知識を得ることができます。
  • Java Swingにおけるjavax.swing.borderパッケージの基本的な役割と重要性
  • Borderインターフェースと、ボーダーを簡単に生成できるBorderFactoryクラスの使い方
  • LineBorderTitledBorderなど、主要なボーダーの種類ごとの特徴と具体的な実装方法
  • 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クラスを使用することが推奨されています。このファクトリクラスは、様々な種類のボーダーオブジェクトを生成するための静的メソッドを提供しており、より簡潔で分かりやすいコードを書くことができます。

例えば、黒い実線のボーダーを作成する場合、以下のように書くことができます。

Borderクラスを直接利用する場合

import javax.swing.border.LineBorder;
import java.awt.Color;
// ...
Border border = new LineBorder(Color.BLACK);

BorderFactoryを利用する場合

import javax.swing.BorderFactory;
import java.awt.Color;
// ...
Border border = BorderFactory.createLineBorder(Color.BLACK);

このように、BorderFactoryを使うことで、コードの意図が明確になり、IDEの補完機能も活用しやすくなります。この記事でも、以降はBorderFactoryを使った方法を基本として解説を進めていきます。


主要なボーダーの種類と使い方を徹底解説

javax.swing.borderパッケージには、様々な用途に応じたボーダークラスが用意されています。ここでは、特によく使われる主要なボーダーについて、その特徴と使い方をサンプルコードとともに詳しく見ていきましょう。

1. EmptyBorder: 余白を作るための透明なボーダー

EmptyBorderは、その名の通り「空」のボーダーです。何も描画しませんが、コンポーネントの周囲に指定したサイズの余白(インセット)を作り出します。コンポーネント間のパディングやマージンを調整するのに非常に便利です。

主な生成メソッド:
BorderFactory.createEmptyBorder(int top, int left, int bottom, int right)
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は、指定した色と太さの直線でコンポーネントを囲みます。最もシンプルで使いやすいボーダーの一つです。角を丸くすることも可能です。

主な生成メソッド:
  • BorderFactory.createLineBorder(Color color)
  • BorderFactory.createLineBorder(Color color, int thickness)
  • BorderFactory.createLineBorder(Color color, int thickness, boolean rounded)
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つのスタイルがあります。

主な生成メソッド:
  • BorderFactory.createEtchedBorder() (デフォルトはLOWERED)
  • BorderFactory.createEtchedBorder(int type)
  • BorderFactory.createEtchedBorder(Color highlight, Color shadow)
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.RAISEDBevelBorder.LOWEREDのスタイルがあります。

主な生成メソッド:
  • BorderFactory.createRaisedBevelBorder()
  • BorderFactory.createLoweredBevelBorder()
  • BorderFactory.createBevelBorder(int type, Color highlight, Color shadow)
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要素をグループ化し、そのグループに名前を付けるのに最適です。

主な生成メソッド:
  • BorderFactory.createTitledBorder(String title)
  • BorderFactory.createTitledBorder(Border border)
  • BorderFactory.createTitledBorder(Border border, String title)
  • BorderFactory.createTitledBorder(Border border, String title, int titleJustification, int titlePosition)

タイトルの表示位置(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)」として組み合わせ、一つの新しいボーダーを作成することができます。

これにより、非常に柔軟で複雑なデザインを実現できます。例えば、「タイトル付きボーダーの外側にさらに余白を追加したい」といったケースで威力を発揮します。

主な生成メソッド:
BorderFactory.createCompoundBorder(Border outsideBorder, Border insideBorder)

以下の例では、TitledBorderの外側にEmptyBorderを配置して、ウィンドウの端から少し離れた位置にグループボックスをレイアウトしています。

実践的な組み合わせ例

import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.TitledBorder;
import java.awt.*;

public class CompoundBorderExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("CompoundBorder Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 250);

        JPanel panel = new JPanel();
        panel.add(new JLabel("このパネルはCompoundBorderを持っています。"));

        // 内側のボーダー: タイトル付き
        Border titled = BorderFactory.createTitledBorder("内側のボーダー");

        // 外側のボーダー: 20pxの余白
        Border empty = BorderFactory.createEmptyBorder(20, 20, 20, 20);

        // 2つのボーダーを組み合わせる
        // 外側にEmptyBorder, 内側にTitledBorderを配置
        panel.setBorder(BorderFactory.createCompoundBorder(empty, titled));

        frame.add(panel);
        frame.setVisible(true);
    }
}

さらに、CompoundBorder自体もボーダーの一種なので、CompoundBorderを入れ子にすることで、3つ以上のボーダーを組み合わせることも可能です。


まとめ

この記事では、Java Swingのjavax.swing.borderパッケージについて、その基本的な役割から主要なボーダーの種類、そして応用的な使い方までを詳しく解説しました。

ボーダーを使いこなすことは、単に見た目を装飾するだけでなく、アプリケーションの構造を視覚的に伝え、ユーザーにとって直感的で分かりやすいGUIを設計するための重要なステップです。

シンプルな余白を作るEmptyBorder、基本的な線を描くLineBorder、立体感を出すEtchedBorderBevelBorder、そして要素を明確にグループ化するTitledBorder。これらの基本的なボーダーを理解し、BorderFactoryで手軽に生成することから始めましょう。

そして、CompoundBorderによる組み合わせをマスターすれば、デザインの可能性は大きく広がります。この記事で紹介した知識とサンプルコードを参考に、ぜひあなたのSwingアプリケーションをより魅力的で使いやすいものにしてください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です