GUIのプログラミングは「レイアウト」と「イベント処理」が少し難しいですが、手順を追っていくと必ず理解できます。まずはAWTを使ってウィンドウを表示するところまで解説します。
【1】新たに sample200 フォルダを作ります。
【2】フォルダの中に PrefTest.java を作成します。このソースコードには2つのクラスと1つの無名内部クラスが書かれています。無名内部クラスについては後で説明します。
*「\」はWindowsではエンマークのことです。
保存先 C:\java\sample200
ファイル名 PrefTest.java
import java.awt.*;
import java.awt.event.*;
class PrefFrame extends Frame {
public PrefFrame(String title) {
//フレームのタイトル
setTitle(title);
//ウィンドウを閉じる時
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
public class PrefTest {
public static void main(String args[]) {
PrefFrame frm = new PrefFrame("都道府県マスター");
frm.setLocation(300, 200);
frm.setSize(250, 350);
frm.setBackground(Color.LIGHT_GRAY);
frm.setVisible(true);
}
}
【3】コマンドプロンプトを起動して、カレントディレクトリを sample200 に切り替えます。
【4】javac PrefTest.java と入力し、コンパイルします。
後で詳しく説明しますが、コンパイルすると3つのクラスファイルが作成されています。
【5】java PrefTest と入力し、プログラムを実行します。
【6】ウィンドウが表示されました。
この時コマンドプロンプトは新たに命令を入力できない状態になっています。
【7】ウィンドウを閉じます。
コマンドプロンプトは命令を入力できる状態になりました。
【解説】
(1)1つのソースコードには複数のクラスが書けますが、public のクラスは1つだけしか書けないルールでしたね。このソースコードには2つのクラスと1つの無名内部クラスが書かれているので、コンパイルすると3つのクラスファイルが作成されます。
(2)AWTを使うには以下のパッケージをインポートする必要があります。event.* はイベント処理に必要なパッケージです。
import java.awt.*;
import java.awt.event.*;
イベントとはマウスでクリックしたり、キーボードから入力したりする操作によって起こる状態の変化のことです。例えばウィンドウの閉じるボタンをクリックしたりするとイベントオブジェクトが発生します。
(3)AWTでウィンドウを表示するにはFrameクラスを継承します。継承することによりスーパークラスの機能が使えるようになります。
class PrefFrame extends Frame {
ポイントは継承したFrameクラスだけでなく、階層をさかのぼって利用できますので、継承の階層構造はチェックしておいたほうがいいです。
「あれ、Frameクラスにないメソッドだな」と思ったときはさらに上のクラスもチェックしてください。
(4)コンストラクタでタイトルの設定と、ウィンドウを閉じるときのイベント処理を行っています。閉じる時のプログラムは難しそうですが、とりあえずそのまま書いておけばOKです。
//フレームのタイトル
setTitle(title);
//ウィンドウを閉じる時
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
上記の2つはAWTでウィンドウを表示するときに最低限必要なものです。閉じるときの処理がないと、コマンドプロンプトに正常に戻れません。コマンドプロンプトが入力を受け付けなくなります。(ハングアップ)
(5)あるクラスの内部に定義するクラスを「内部クラス」といいます。さらに内部クラスに名前を付けないで利用する時は「無名内部クラス」といいます。無名内部クラスはイベント処理によく利用されます。
(6)無名内部クラスの部分だけ抜き出してみます。
new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
addWindowListener()には、WindowAdapter を継承したクラスのインスタンスを引数としなければならないのですが、このクラス内でしか使わないことが明確なので、内部クラスにしています。しかも一度インスタンスを生成して参照を返せばいいだけなので、わざわざ名前を付ける必要もないということで、無名内部クラスになります。
無名内部クラスはクラス名の代わりに「new スーパークラス名」を書きます。無名内部クラスでも内部のメソッドは通常のクラスと同じように書いています。
(7)無名内部クラスは名前が無いので、コンパイルすると以下のようなクラス名が自動で付けられます。「$」ダラーの後に番号が振られています。
PrefFrame$1.class
(8)mainメソッドを持つクラスで PrefFrame クラスのインスタンスを生成しています。インスタンス生成時にはコンストラクタが呼び出されます。
PrefFrame frm = new PrefFrame("都道府県マスター");
(9)後はインスタンスに対して、Frameクラスから継承したメソッドを使い、各設定を行います。
ウィンドウの表示位置
frm.setLocation(300, 200);
ウィンドウのサイズ
frm.setSize(250, 350);
ウィンドウの背景色
frm.setBackground(Color.LIGHT_GRAY);
ウィンドウを表示する
frm.setVisible(true);
(10)setBackground()メソッドについて
・Color.LIGHT_GRAY は Color クラスの定数です。クラス名.フィールド名 の形です。他にもいろいろな色が指定できます。
・java.awt.Color クラスのコンストラクタはオーバーロードされているので、いろんな引数でウィンドウの背景色を指定できます。int型を引数にすると、RGBカラーが使えるので色の設定が細かくできます。new演算子を使ってインスタンスを生成しているところがポイントです。
frm.setBackground(new Color(9, 150, 212));