アプリケーションの構成
ここではHello Worldを表示する最も簡単なJavaアプリケーションを書いてみます。私の書くJavaアプリケーションはフレームとメインパネルの二部構成を取っています。今後書くアプリケーションはすべて同じ枠組みですのでここで詳しく解説します。
フレームとパネル
私の書くゲームアプリケーションはフレーム(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()で貼り付けているだけです。画面への描画などの処理はパネルがすべて担当しており、フレームはパネルを乗せる単なる土台にすぎません(下図参照)。
メインメソッド
アプリケーションは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); }