Swingのレイアウトマネージャー<前編>[Java]
はじめに
こんにちは。
プログラミング初心者wakinozaと申します。
Java勉強中に調べたことを記事にまとめています。
十分気をつけて執筆していますが、なにぶん初心者が書いた記事なので、理解が浅い点などあるかと思います。
間違い等あれば、指摘いただけると助かります。
記事を参考にされる方は、初心者の記事であることを念頭において、お読みいただけると幸いです。
対象読者
- Javaを勉強中の方
- Swingについて知りたい方
記事のテーマ
- SwingでGUIアプリケーションを作った際に、コンポーネントの配置が思うようにならなくて苦労しました。swingのレイアウトは種類が豊富なので、備忘録も兼ねてまとめることにしました。
- 記事は前編と後編の2部構成の予定です。
- 前編の今回はSwingの歴史と概論についてまとめていきます。後編では、個々のレイアウトの詳細をまとめていきます。
動作環境
- MacBook (IntelCore)
- Oracle Java 21
- Intellij IDEA Community Edition 2025.1.2
目次
1. Swingとは
2. SwingのGUI作成の基本
3. レイアウトマネージャー
本文
1. Swingとは
開発者は、ユーザーの目的を達成するための機能(画像編集、文章作成、データの分析など)をアプリケーションとして提供します。
アプリケーションとユーザーが対話する方法、すなわち「ユーザーインターフェース(UI)」には、大きく分けてCLIとGUIの2種類の方法があります。
1-1. CLIとGUI
CLI (Command Line Interface) と GUI (Graphical User Interface) は、どちらもコンピュータを操作するため方法ですが、その方法は全く違います。
CLIは、「コマンドプロンプト」や「ターミナル」などのツールに、キーボードでコマンド(命令文)を入力し、その結果がテキストとして表示される方法です。
利点は、高速で効率的な操作が可能で、自動化も容易な点です。
欠点は、コマンド入力を覚える学習コストが高い点です。
開発者向けの方式といえます。
一方のGUIは、アイコン・ボタンなどの視覚的な要素を表示されます。
ユーザーは、マウスやタッチパネルなどで要素を操作し、操作結果も視覚情報として表示されます。
利点は、直感的な操作ができるため特別な知識がなくてもアプリケーションを利用できる点です。
欠点は、グラフィックが必要であるため、CLIに比べてリソースを多く必要とする点、提供されている機能以外の操作が難しい点、自動化が難しい点などが挙げられます。
エンドユーザー向けの方式といえます。
このように、CLIは開発者にとっては便利ですが、エンドユーザーにとっては学習コストが高いため、不向きと言えます。
そのため、エンドユーザー向けのアプリケーションの多くは、GUIで開発されています。
GUIの開発ツールは多種ありますが、Java言語でGUIを作成するライブラリの一つが、「Swing」です。
1-2. Swingの歴史
Java言語のGUIライブラリは、主に3つあります。
リリースが古い順に並べると、「AWT(Abstract Window Toolkit)」・「Swing」・「Java FX」です。
最初に提供されたのは、「AWT」です。
1996年にJavaがリリースされた際、「AWT」も同時に提供されました。しかし、AWTは非常に低水準な命令しか持っていない点や、OSによって見た目が変わる点が問題となっていました。
そこで、「OSには依存しない」「高水準な命令や豊富なウィジェット」を備えた次世代GUIライブラリとして「Swing」が開発されました。
AWTはOSネイティブのGUI部品を利用する重量コンポーネントであったため、実行するOSによって見た目が変わってしまうという問題がありました。そこでSwingでは、Java言語でGUIを描画する軽量コンポーネントという仕組みを採用し、OSに依存しないUIを実現しました。
また、SwingはOSに依存しないだけでなく、プラグイン可能なルック・アンド・フィール (PLAF) という仕組みを備えています。これにより、アプリケーションの見た目や操作感を柔軟に変更することが可能になりました。
その後、画面設計と動作処理のプログラミングを分離し、かつ高水準な特徴を持った近代的なAPIとして「Java FX」が開発されました。
Java8からJDKの一部として同梱され、swingの後続として幅広く利用されてきましたが、Java11からはJDKと分離され、「OpenJFX」と言う独立したオープンソースライブラリとして提供されています。
現在、本格的なGUIアプリケーションを作る場合は「OpenJFX」が推奨されます。
しかし、Swingも、簡単なGUIアプリケーションを作るには十分な機能を備えています。その上、多くのバグが修正されて非常に安定している点、JDKに同梱されているため、導入コストが低い点も利点です。
現在も、簡単なGUIアプリケーションを作りたい場合や、初心者が手軽にGUIアプリケーションの学習を行う場合には、Swingが利用されています。
2. SwingのGUI作成の基本
Swingは、「器であるコンテナに、部品となるコンポーネントを配置していく」ことで、GUIを作成していきます。
GUIアプリケーションを「引き出し」に例えると、コンテナは「空間そのもの」、コンポーネントはハサミやペンなどの「機能を持った道具」のようなものと言えます。
コンテナという空間の中に、コンポーネントを自由に配置することで、思い通りのUIを作成することができるのです。
2-1. コンテナ
コンテナは、他のコンテナやコンポーネントを格納する「器」の役割を果たす部品です。
コンテナは、さらに「トップレベルコンテナ」と「中間コンテナ」の2つに分かれます。
「トップレベルコンテナ」とは、OSのウィンドウシステムと直接連携するコンテナで、GUIアプリケーションの画面の土台となる役割を担います。メインウィンドウを作成するJFrame、ポップアップなどの一時的なウィンドウを作成するJDialogなどがあります。
引き出しの例えで言うと、トップレベルコンテナは「引き出し空間そのもの」と言えます。
「中間コンテナ」とは、コンポーネントをグループにまとめたり、UIを整理するためのコンテナです。汎用的なJPanel、スクロール機能がついたJScrollPaneなどがあります。
引き出しの例えで言うと、小物を整理するための「仕切りケース」のようなものと言えます。
GUIアプリケーションは、トップレベルコンテナであるjavax.swing.JFrameクラスを土台として作成します。
JFrameクラスは、メインウィンドウを司るクラスで、他のコンテナやコンポーネントを配置する際の最上位の「器」です。タイトルバーや最小化・最大化ボタンなどを持つ独立したウィンドウを作成します。
import javax.swing.JFrame;
public class Main {
public static void main(String[] args) {
//JFrameインスタンスを生成する
//引数でウィンドウバーに表示する文字列を指定する
JFrame frame = new JFrame("JFrameの説明");
//「閉じる」ボタンを有効にする
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//フレームのサイズを指定する
frame.setSize(400, 200);
//フレームを画面に表示する
frame.setVisible(true);
}
}
上のコードを実行すると、以下のようなウィンドウが表示されます。
このJFrameが、 UIの器となります。
JFrameの説明
2-2. コンポーネント
コンポーネントとは、UIを構成する様々な部品のことです。
「ウィジェット」と呼ばれることもあります。
文字列を表示(JLabel)、ボタン(JButton)、チェックボックス(JCheckBox)、1行入力欄(JTextField)などのコンポーネントがswingで用意されています。
この記事では紹介しきれないほどたくさんのコンポーネントが用意されているので、気になる方は公式ドキュメントを確認してください。
これらコンポーネントをコンテナに追加することで、UIを作成します。
例として、先ほどのJFrameにJButtonを追加してみましょう。
JFrame frame = new JFrame("コンポーネントの説明");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 200);
//レイアウトを設定する
frame.setLayout(new FlowLayout());
//JButtonのインスタンスを生成する
JButton button = new JButton("ボタン");
//buttonをframeに追加する
frame.add(button);
frame.setVisible(true);
上のコードを実行すると、以下のようなウィンドウが表示されます。
JFrameにボタンが追加できました。
コンポーネントの説明
2-3. 入れ子構造
コンテナは、コンテナの中にさらにコンテナを入れるという「入れ子構造」が可能です。トップレベルコンテナであるJFrameに中間コンテナであるJPanelを格納し、JPanelの中にJScrollPaneを格納するということも可能です。
求めるUIが複雑な場合は、コンポーネントを中間コンテナに格納し、格納した中間コンテナをさらに別の中間コンテナに格納するという入れ子構造を作ることで、目的とするUIを構成していきます。
JFrame frame = new JFrame("入れ子構造の説明");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 400);
// レイアウトを設定する
frame.setLayout(new BorderLayout());
// 左側のパネルを作成し、FlowLayoutを設定
JPanel numButtonPanel = new JPanel();
numButtonPanel.setLayout(new FlowLayout());
// パネルにボタンを追加
JButton button1 = new JButton("1");
JButton button2 = new JButton("2");
numButtonPanel.add(button1);
numButtonPanel.add(button2);
// numButtonPanelをJFrameの左側(WEST)に追加
frame.add(numButtonPanel, BorderLayout.WEST);
// 右側のパネルを作成し、FlowLayoutを設定
JPanel charButtonPanel = new JPanel();
charButtonPanel.setLayout(new FlowLayout());
// パネルにボタンを追加
JButton buttonA = new JButton("A");
JButton buttonB = new JButton("B");
charButtonPanel.add(buttonA);
charButtonPanel.add(buttonB);
// charButtonPanelをJFrameの右側に追加
frame.add(charButtonPanel, BorderLayout.EAST);
frame.setVisible(true);
入れ子構造の説明
上のコードでは、合計4つのJButtonが存在しますが、それぞれを2つの別の中間コンテナ(この場合、JPanel)に整理され、UI上でも区別しやすくなります。
このようにコンポーネントが複数ある場合、それぞれを別の中間コンテナに格納することで、コンポーネントを整理することができます。
コンテナやコンポーネントを入れ子構造にすることで、複雑なUIも実現することができるのです。
3. レイアウトマネージャー
コンポーネントやコンテナ配置の重要な点の一つが、「配置位置の指定」です。
SwingにはsetLocationメソッド(位置のみ設定)やsetSizeメソッド(サイズのみ設定)やsetBoundsメソッド(位置とサイズを同時に指定)などのメソッドが用意されています。
これらのメソッドを呼び出すことで、開発者はコンテナやコンポーネントの正確な位置(x, y座標)とサイズを指定できます。
このような手動で配置位置を指定する方法を、「絶対配置」と言います。
しかし、この絶対配置には欠点があります。
ウィンドウのサイズが変わった際に配置を臨機応変に変更することが難しいのです。そのため、ウィンドウのサイズによってはUIが崩れたり、見切れる可能性があります。
そのため、Swingでは、「レイアウトマネージャー」という仕組みを利用して、コンテナやコンポーネントの配置を調整することが一般的です。
Swingでは、「配置のルール」が「レイアウト」として用意されています。
コンテナに「レイアウトマネージャー」を設定すると、ルール(レイアウト)に従って、追加されたコンポーネントの位置や大きさが自動的に調整されます。
「レイアウトマネージャー」を使用すると、絶対配置を指定しなくても、コンポーネントは適切な位置や大きさに自動的に再調整されます。また、異なるOSで実行しても、UIが崩れる心配はありません。
まとめ
-
JavaのGUIライブラリであるSwingは、コンテナにコンポーネントを配置することでUIを構築する
-
GUIは、JFrameなどのトップレベルコンテナにJPanelなどの中間コンテナを入れ子構造で配置することで、複雑なUIを整理し構築できる
-
絶対配置ではウィンドウサイズの変化に対応できないため、自動で配置を調整する「レイアウトマネージャー」の利用が推奨されている
記事は以上です。
次回は、個々のレイアウトの特徴と用途を見ていきます。
最後までお読みいただき、ありがとうございました。
参考情報一覧
この記事は以下の情報を参考にして執筆しました。
- [プロになるJava]
- [スッキリわかるJava入門 実践編 第4版]
- swingを使ってみよう (最終更新 2024-10-14) (参照 2025-09-12)
- Java Swing レイアウトで遊ぶ(最終更新 2022-09-01) (参照 2025-09-12)
- 公式ドキュメント (参照 2025-09-12)
Discussion