はじめに (対象読者・この記事でわかること)
この記事は、Javaの基本的なGUIプログラミングに興味がある方、特にゲーム開発の入門として、インタラクティブな要素を実装したいと考えている方を対象としています。
この記事を読むことで、以下のことがわかるようになります。
- Java Swingを使った基本的なGUIウィンドウの作成方法
- キーボードイベント(スペースキーの押下)を検知し、処理する方法
- 描画する図形の大きさを動的に変更し、画面を更新する方法
- 簡単なゲームロジックの実現に向けた第一歩
プログラミングの経験があまりない方でも、コードを追いながら理解できるよう、丁寧に解説していきます。
前提知識
この記事を読み進める上で、以下の知識があるとスムーズです。
- Javaの基本的な文法(変数、クラス、メソッド、if文など)
- オブジェクト指向プログラミングの基本的な概念(クラス、オブジェクト)
Java SwingでGUIウィンドウを作成する
まずは、JavaでGUIアプリケーションを作成するための定番ライブラリであるSwingを使って、基本的なウィンドウを作成しましょう。ここでは、JFrame クラスを使ってウィンドウを作成し、その中に四角形を描画するための準備をします。
JFrame と JPanel の基本
JFrame はウィンドウそのものを表し、JPanel はそのウィンドウ内に描画を行うための領域を提供します。四角形を描画する処理は、JPanel を継承したカスタムクラスを作成し、その paintComponent メソッドをオーバーライドして実装するのが一般的です。
Javaimport javax.swing.*; import java.awt.*; public class RectangleToggleGame extends JFrame { private GamePanel gamePanel; public RectangleToggleGame() { setTitle("Rectangle Toggle Game"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(600, 400); setLocationRelativeTo(null); // ウィンドウを中央に配置 gamePanel = new GamePanel(); add(gamePanel); setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(RectangleToggleGame::new); } } class GamePanel extends JPanel { private int rectSize = 50; // 初期サイズ private boolean isBig = true; // 現在のサイズ状態 (true: 大きい, false: 小さい) public GamePanel() { // キーイベントを受け取るためにフォーカス可能にする setFocusable(true); // Spaceキーのイベントを処理するためにKeyStrokeを設定 InputMap im = getInputMap(WHEN_FOCUSED); ActionMap am = getActionMap(); // Spaceキーが押されたときのキーマップとアクションマップを設定 im.put(KeyStroke.getKeyStroke("pressed SPACE"), "toggleRect"); am.put("toggleRect", new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { toggleRectangleSize(); } }); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); // 親クラスの描画処理を呼び出す Graphics2D g2d = (Graphics2D) g; // 四角形を描画 int x = (getWidth() - rectSize) / 2; int y = (getHeight() - rectSize) / 2; g2d.setColor(Color.BLUE); g2d.fillRect(x, y, rectSize, rectSize); } private void toggleRectangleSize() { if (isBig) { rectSize = 25; // 小さくする } else { rectSize = 50; // 大きくする } isBig = !isBig; // 状態を反転 repaint(); // 画面を再描画するよう要求 } }
このコードでは、RectangleToggleGame クラスがウィンドウを作成し、GamePanel クラスが実際に四角形を描画する役割を担います。GamePanel クラスでは、setFocusable(true) でフォーカスを受け取れるようにし、InputMap と ActionMap を使ってスペースキーが押されたときに toggleRectangleSize メソッドが呼ばれるように設定しています。
スペースキーによる四角形のサイズトグル実装
このセクションでは、スペースキーが押されたときに四角形の大きさを「2倍」「1倍」「2倍」「1倍」と交互に切り替える(トグルする)ための具体的な実装方法を解説します。
イベントリスナーと状態管理
Java Swingでは、ユーザーの操作(キー入力、マウス操作など)は「イベント」として扱われます。このイベントを捉え、それに応じた処理を実行するのが「イベントリスナー」の役割です。
今回、スペースキーの押下を検知するために、InputMap と ActionMap を利用します。これは、キーボードイベントをより簡潔に処理するための仕組みです。
setFocusable(true):JPanelがキーイベントを受け取れるように、フォーカス可能に設定します。InputMap: どのキー(またはキーの組み合わせ)が押されたときに、どのような「キー名」を発生させるかを定義します。ここでは、スペースキー ("pressed SPACE") が押されたら"toggleRect"というキー名を発生させるように設定します。ActionMap:InputMapで定義された「キー名」と、実際に行われる「アクション」(メソッドの呼び出しなど)を紐付けます。ここでは、"toggleRect"というキー名に対して、AbstractActionを実装した無名クラスを関連付けます。この無名クラスのactionPerformedメソッド内に、四角形のサイズを切り替える処理を記述します。
toggleRectangleSize() メソッドの詳細
Javaprivate int rectSize = 50; // 四角形の現在のサイズ (初期値) private boolean isBig = true; // 現在のサイズ状態 (true: 大きい (50), false: 小さい (25)) private void toggleRectangleSize() { if (isBig) { // 現在が大きい状態なら、小さくする rectSize = 25; } else { // 現在が小さい状態なら、大きくする rectSize = 50; } isBig = !isBig; // 状態を反転させる repaint(); // 画面の再描画を要求する }
rectSize変数で四角形の現在のサイズを管理します。isBigというboolean型の変数で、現在のサイズが「大きい」状態か「小さい」状態かを判別します。- スペースキーが押されるたびに
toggleRectangleSize()メソッドが呼ばれます。 if (isBig)の条件分岐で、現在の状態に応じてrectSizeの値を25または50に変更します。isBig = !isBig;で、状態を真偽反転させます。これにより、次回の呼び出し時には逆の処理が行われます。repaint()メソッドが重要です。これはSwingに「このコンポーネント(GamePanel)を再描画してください」と通知します。この通知を受けると、Swingは自動的にpaintComponentメソッドを再度呼び出し、更新されたrectSizeに基づいて四角形が再描画されます。
描画処理 (paintComponent メソッド)
paintComponent メソッドは、コンポーネントの描画を行うためのメソッドです。このメソッドが呼び出されるたびに、現在の rectSize に基づいて四角形が描画されます。
Java@Override protected void paintComponent(Graphics g) { super.paintComponent(g); // Swingの標準的な描画処理を必ず呼び出す Graphics2D g2d = (Graphics2D) g; // より高機能な描画のためにGraphics2Dにキャスト // 四角形を描画するための位置を計算 int x = (getWidth() - rectSize) / 2; // ウィンドウの中央に配置するためのX座標 int y = (getHeight() - rectSize) / 2; // ウィンドウの中央に配置するためのY座標 g2d.setColor(Color.BLUE); // 描画色を青に設定 g2d.fillRect(x, y, rectSize, rectSize); // 指定された位置に指定されたサイズの四角形を描画 }
super.paintComponent(g);は、Swingの提供する基本的な描画処理(背景のクリアなど)を実行するために重要です。これを呼び出さないと、予期しない描画の問題が発生することがあります。Graphics2DはGraphicsより高度な描画機能を提供するため、キャストして使用します。getWidth()とgetHeight()は、JPanel自体の現在の幅と高さを返します。これらを使って、四角形がウィンドウの中央に来るように座標 (x,y) を計算しています。g2d.fillRect(x, y, rectSize, rectSize);で、計算された位置 (x,y) に、現在のrectSizeの幅と高さを持つ青色の塗りつぶされた四角形を描画します。
実行と確認
このコードをコンパイル・実行すると、中央に青い四角形が表示されたウィンドウが現れます。ウィンドウがアクティブな状態でスペースキーを押してみてください。押すたびに四角形の大きさが半分になり、もう一度押すと元の大きさ(2倍)に戻ることを確認できるはずです。
これが、Javaでイベント駆動型のインタラクティブなGUIアプリケーションを作成する基本的な流れです。
まとめ
本記事では、Java Swingを用いて、スペースキーの押下をトリガーとして四角形の大きさを交互に切り替える(トグルする)方法を解説しました。
- GUIウィンドウの基本:
JFrameとJPanelを使ってウィンドウと描画領域を作成しました。 - キーイベントの検知:
InputMapとActionMapを利用し、スペースキーが押されたことを検知し、カスタムアクションを紐付けました。 - 状態管理と再描画:
boolean変数でサイズの状態を管理し、repaint()メソッドを呼び出すことで、描画内容を動的に更新しました。 - 描画処理:
paintComponentメソッド内で、現在の状態に応じたサイズの四角形を描画しました。
この記事を通して、JavaでのGUIプログラミングの基本と、ユーザーインタラクションに対する応答を実装する第一歩を理解していただけたことと思います。
今後は、この基本的な仕組みを応用して、キー操作でキャラクターを動かしたり、ゲームの状態を管理したりといった、より複雑なゲームロジックの実装へと発展させていくことができます。
参考資料
- Swing Tutorial - How to Use the Input Map and Action Map
- Swing Tutorial - Painting in J Components
- Java Swing GUI Programming Tutorial
