読者です 読者をやめる 読者になる 読者になる

人工知能に関する断創録

人工知能、認知科学、心理学、ロボティクス、生物学などに興味を持っています。このブログでは人工知能のさまざまな分野について調査したことをまとめています。最近は、機械学習、Deep Learning、Kerasに関する記事が多いです。



アプリケーションの構成

ここではHello Worldを表示する最も簡単なJavaアプリケーションを書いてみます。私の書くJavaアプリケーションはフレームとメインパネルの二部構成を取っています。今後書くアプリケーションはすべて同じ枠組みですのでここで詳しく解説します。

hello_world.jar

フレームとパネル

私の書くゲームアプリケーションはフレーム(JFrameを拡張したクラス)とパネル(JPanelを拡張したクラス)から成り立っています。フレームはアプリケーション本体です。アプリケーションの開始点であるmain()を持ちます。パネルはゲームのメイン画面です。オセロゲームだったら盤面、RPGだったらフィールドを描画する場所となります。

HelloWorld.javaです。

import java.awt.*;
import javax.swing.*;

public class HelloWorld extends JFrame {
    public HelloWorld() {
        // タイトルを設定
        setTitle("Hello Worldを表示する");

        // メインパネルを作成してフレームに追加
        MainPanel panel = new MainPanel();
        Container contentPane = getContentPane();
        contentPane.add(panel);

        // パネルサイズに合わせてフレームサイズを自動設定
        pack();
    }

    public static void main(String[] args) {
        HelloWorld frame = new HelloWorld();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

MainPanel.javaです。

import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JPanel;

public class MainPanel extends JPanel {
    // パネルサイズ
    private static final int WIDTH = 240;
    private static final int HEIGHT = 240;

    public MainPanel() {
        // パネルの推奨サイズを設定、pack()するときに必要
        setPreferredSize(new Dimension(WIDTH, HEIGHT));
        // 変数などの初期化
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        // 盤面を描いたり、フィールドを描いたりする
    }
}

フレームクラス(HelloWorld)自体はたいしたことをしていません。タイトルを設定し、フレームのcontentPaneというところにパネル(MainPanelオブジェクト)をadd()で貼り付けているだけです。画面への描画などの処理はパネルがすべて担当しており、フレームはパネルを乗せる単なる土台にすぎません(下図参照)。

f:id:aidiary:20090827214622g:plain

メインメソッド

アプリケーションはmain()から開始されます

    public static void main(String[] args) {
        HelloWorld frame = new HelloWorld();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

main()の1行目ではHelloWorldフレームのオブジェクトを作っています。HelloWorldクラス内のmain()で HelloWorldオブジェクトを作るのは変だと思われるかもしれませんが、main()がstaticメソッドであるため正しい書き方です。この書き方は分かりにくいという指摘もありますが、簡潔なため採用しました。

2行目はフレームの終了処理を指定しています。これを書かないとプログラムが終了できなくなります。こう書くもんだと思ってください。3行目は画面にフレームを表示します。フレームはsetVisible(true)しないと画面に表示されません。

描画処理

描画処理はパネル(MainPanel)のpaintComponent()に書きます。paintComponent()はGraphicsオブジェクトgを引数として受け取ります。このgを通して文字、図形、イメージを描画することができます。今回はdrawString()を使って画面上にHello Worldを描画しています。

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        // (20,50)の位置にHello Worldを描画する
        g.drawString(str, 20, 50);
    }