●1〜2行目
パッケージのimport。パッケージとはクラスの集まりのことです。
このプログラムでは、システムに用意されている、
- AWT(アブストラクト ウィンドウ ツールキット)のクラス全部
- Swingのクラス全部
を簡潔な形で参照できるようにしています。
1行目を省略すると、9行目を次のように書かなければいけません。
java.awt.Container pane = getContentPane();
2行目を省略すると、次の3ヶ所の書き方が変わります。
public class MyName extends javax.swing.JFrame{
(4行目)
setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
(8行目)
pane.add( new javax.swing.JLabel("藤村 光") );
(11行目)
import を使わずに書いたプログラム
MyNameX.java
DisplayMyName.java も MyName.java も
import java.awt.* ;
import javax.swing.* ;
のように、
* を書きました。
これは、
java.awt パッケージにあるクラス全部と、
javax.swing パッケージにあるクラス全部が対象となります。
短い記述で多くのクラスを引きずり込むことができますが、
プログラムに書かれたクラスがどのパッケージのものなのかが解りにくくなります。
使用するクラスをひとつずつ丁寧に書く方法もあります。
●4行目
クラス定義の始まり。
ここで開いた中カッコ { は、20行目で
閉じられます。つまり、4〜20行目で、MyName という名前の
クラスを宣言しています。
クラス定義は、以下の構成をしています。
exptends 親クラス名 を記述することによって
他のクラスを継承することを示します。
このプログラムでは、 MyName クラス は JFrame クラスを継承すると記述されています。
JFrame を MyName の親クラス と呼びます。
MyName は JFrame の子クラスであるといいます。
オブジェクトがもつデータの性質を記述する「フィールドの定義」と、
そのオブジェクトを生成する方法を記述する「コンストラクタの定義」、
および、データの取り扱い方を記述する「メソッドの定義」からなっています。
この順序で書くのが普通ですが、どのような順序でもかまいませんし、
必要なものだけを書けばよいのです。
このプログラムでは、「フィールドの定義」がなく、
「コンストラクタの定義」と「メソッドの定義」がひとつづつあるだけです。
継承とは、何か?
クラス MyName が クラス JFrame を継承するということは、
「 MyName の定義について ここ(4〜20行目)に書かれていないことは、
クラス JFrame で決められているとおりにしなさい 」 ということです。
MyName についての継承関係は次の通りです。
Object → Component → Container → Window → Frame → JFrame → MyName
継承関係は、植物や動物の分類にたとえられます。例の、
動物 → 脊椎動物 → 哺乳類(網) → 霊長類(目) → ヒト
を思い出してください。
MyName は JFrame のなかまであり、さらに Frame のなかまで、さらに
Window(いわゆるウィンドウ)のなかまであるということです。
つまりすこし荒っぽく言えば NyMameは、四角な形状で、上辺にタイトル・バーがあり、
サイズや表示位置を変更できる、いわゆるウィンドウだということです。
今回の例で言えば、ウィンドウを表示したり、サイズを変更したり、
最大化、最小化をする部分は JFrame を流用して、
足りない部分(1)タイトルバーの表示、(2)クローズ時の処理の指定、
(3)名前ラベルの貼り付け、(4)大きさの調整、(5)可視化の5点を
追加したクラス MyName を作ってしまおう、
ということです。
以下、クラス定義の中身(つまり、JFrame とどこが違うのかという記述)について説明します。
●6行目
コンストラクタの定義の始まり。ここで開かれた中カッコ
{ は 15行目で閉じられます。
つまり、6〜15行目でコンストラクタが定義されます。
コンストラクタ って何?
MyName クラスのインスタンスを生成する方法を定義しています。
つまり、 MyName という性質のデータを1つ作り出す際の手順を記述しています。
実際には、18行目の new 以下で MyName クラスのデータを作れと
指示されると、7行目から14行目が順に実行されます。
18行目で、渡された文字列 "私の名前" は、コンストラクタの中では、
s という名前で参照されます(6行目の String s の意味 )。
以下、コンストラクタの中身について説明します。
●7行目
親クラス JFrame のコンストラクタを呼び出し、文字列 "私の名前" を渡します。
この文字列はフレームのタイトルとして、タイトルバーの左端に表示されます。
MyName クラスを作成するにあたり、最初にすべきことは JFrame をパクってくることです。
コンストラクタの先頭に書き、親クラスのコンストラクタにパラメタを渡します。
コンストラクタの呼び出しですが、new ... ではなく、
super という特別の名前を使います。
渡すべきパラメタが無い場合はこの行を省略できます。
コンパイラが勝手に super(); を挿入してくれます。
●8行目
生成中のインスタンスに対して、このインスタンスが(Windowとして)
close される際の処理を指定しています。
EXIT_ON_CLOSE を指定することによって、
ウィンドウを閉じるとプログラムが終了するようになります。
8行目を省略した場合の状況は、
「1章のまとめ 【setDefaultCloseOperation の働き】」を参照してください。
●9行目
frame に直接ラベルを貼り付けることはできません。
ラベルを貼るために、作成中の MyName クラスのインスタンスののコンテントペインを取り出してきて、
pane という名前を付けています。
この部分は、次のように2行に分けて書くことができます。
Container pane;
pane = getContentPane();
前半は、 pane という名前が、クラス Container のインスタンスに付けられる名前であることと、
このコンストラクタの中の残りの部分で有効なことを示しています。
これを変数の宣言といいます。
詳細は10章に記述しますが、
とりあえず、変数(名前)が最初に現れる時に宣言が必要だということを憶えてください。
後半は、「現在作成中の」インスタンスのコンテントペインを取得して、
宣言済みの pane という名前を付けています。
「現在作成中の」というのは、コンストラクタの中でのみ有効な表現です。
1.1 節の場合は、frame という名前をつけたインスタンス
ということを明示して
frame.getContentPane()
と記述しています。
●11行目
「藤村 光」と書いたラベルを生成し、
(作成中の MyName クラスのインスタンスの) pane 部分 に貼り付けています。
ポスト・イットのようなラベルを考えてください。四角い形をしていて、
表面に文字や絵柄を書いて、どこかに貼り付けることができるものが JLabel
です。文字列1つ、絵柄1つ、あるいは文字列と絵柄の両方を貼り付けることが出来ます。
JLabel の英語の発音は [] 、日本語ではジェイラベルと言います。
9行目でわざわざ付けた名前 pane も、11行目でしか使っていません。このような場合、
名前をつけずに、9〜11行をまとめて次のように書いてもまったく同じ処理がされます。
getContentPane().add( new JLabel("藤村 光") );
●13行目
作成中の MyName クラスのインスタンスの大きさを調整し、張付けた内容が表示されるようにします。
●14行目
作成中のインスタンスを画面に表示します。可視化といいます。
JFrame は、最初は見えない状態になっていて、
プログラムの中で必要なときに見せたり、隠したりできるようになっています。
可視化をすると、Javaのシステムがこのインスタンスの面倒をみる仕事を始めます。
この行を省略すると、何も表示されずにプログラムが終了し、
DOS画面でプロンプトが表示されます。
可視化した場合には、8行目のように Frame を閉じた時にプログラムを終了するように指定しないかぎり、
ウィンドウが消えてもプログラムは終了しません。
●17行目
メイン・メソッドの定義の始め。ここで開かれた中カッコ
{ は、
19行目で閉じられます。つまり、17〜19行目までが、
メイン・メソッドの定義です。
メイン・メソッド て何?
簡単にいうと、
プログラムを実行すると、この
public static void main(String args[]){
...
...
}
の部分が上から順に実行される、と理解してください。
ここでは、1行しかありませんから、DOS画面から
java MyName
と入力すると、
new MyName("私の名前");
が実行されます。
●18行目
MyName のインスタンスの生成のために、
文字列 "私の名前" を渡して、コンストラクタ を呼び出しています。
つまり、6行目に行って文字列 "私の名前" に
s という名前をつけ、
7行目から順に実行します。
14行目まででインスタンスの作成が終わると、
18行目に戻ってきて、
main メソッドの実行が終了します。
main メソッドは終了するのですが、
生成した MyName のインスタンスが14行目で可視化されていますから、
プログラムの実行は終了しません。
8行目の指定にしたがって、ウィンドウを閉じたときに終了します。
インスタンスの生成は次のように記述します。
new コンストラクタ名 ( パラメタ )
パラメタが複数ある場合はコンマで区切って並べます。
コンストラクタが呼ばれるたびに新しいインスタンスができる様子を見てみましょう。
プログラム
MyNameU.java
画面の左上隅に1つしか表示されていないように見えますが、
移動してみましょう。下から生成した順に重なっているのが判ります。
どれか1つのウィンドウを閉じればプログラムが終了し、
他のウィンドウも消え画面にプロンプトが表示されます。
「私の名前」を閉じた時にだけプログラムが終了するようにできるでしょうか?
ここまできたら、名前もパラメータにしてみましょう。