1.2 のプログラムの補足説明

1.2 で例に掲げた MyName.java の解説です。 1.1 のプログラムの補足説明と重複する部分もありますが、 新しいことも書いてありますのでざっと目を通してください。 説明が長くなりますので、 ソースプログラムのリスト を別ウィンドウで開いておくと(少し)読みやすくなるかもしれません。

参考 1.2 氏名を表示するウィンドウ
参考 1.1 のプログラム DisplayMyName.java の補足説明

【プログラムの構造】

page-1-2-program.gif

【プログラムの詳細】

●1〜2行目

パッケージのimport。パッケージとはクラスの集まりのことです。
このプログラムでは、システムに用意されている、

を簡潔な形で参照できるようにしています。
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.javaMyName.java

import java.awt.* ;
import javax.swing.* ;
のように、 * を書きました。 これは、 java.awt パッケージにあるクラス全部と、 javax.swing パッケージにあるクラス全部が対象となります。 短い記述で多くのクラスを引きずり込むことができますが、 プログラムに書かれたクラスがどのパッケージのものなのかが解りにくくなります。 使用するクラスをひとつずつ丁寧に書く方法もあります。
●4行目

クラス定義の始まり。 ここで開いた中カッコ { は、20行目で 閉じられます。つまり、4〜20行目で、MyName という名前の クラスを宣言しています。

クラス定義は、以下の構成をしています。

simple-class-def.gif
< 10.1節 から抜粋 >

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 という名前を付けています。
J2SE 5.0 では JFrame に直接ラベルを貼れるようになりました。
DisplayMyNameT2.java
この部分は、次のように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つしか表示されていないように見えますが、 移動してみましょう。下から生成した順に重なっているのが判ります。

MyNameU-1.gif

どれか1つのウィンドウを閉じればプログラムが終了し、 他のウィンドウも消え画面にプロンプトが表示されます。

「私の名前」を閉じた時にだけプログラムが終了するようにできるでしょうか?

プログラム MyNameU2.java

MyNameU.java からの変更箇所 を赤字で示します。

ここまできたら、名前もパラメータにしてみましょう。

プログラム MyNameU3.java

実行結果   MyNameU3-1.gif


Top Page
更新日:2012/04/02

Valid HTML 4.01 Transitional