「ウィンドウを作る」
さて、Javaの基礎がわかったところで、いきなり「ウィンドウを作る」というところまでジャンプしてしまいましょう。Javaでは、ちゃんとウィンドウやボタンなどを使ったGUI(Graphical User Interfaceね)を作れるんですよ。ただし、それを覚えるにはちょっとホネが折れます。覚悟してくださいね。
まず、何はともあれリストを見てください。
import java.awt.*; public class Test4 extends Frame { public Test4 () { super (); } public static void main (String args []) { Test4 myWindow; myWindow = new Test4 (); myWindow.show (); } }
これが、画面にウィンドウを表示する「Test4」クラスのプログラムリストです。「Test4.java」という名前で保存してコンパイルしてください。起動すると、画面の左上にちっちゃなウィンドウが現われるはずです。
このウィンドウ、クローズボックスをクリックしても閉じないし、右下のサイズボックスをドラッグすると大きさは変わるけれど、どうも中途半端でいけません。けれど、一応ウィンドウはウィンドウです。ちゃんと表示できるだけでも大きな前進ですよ。 ――では、実行を確かめたら、WindowsならMS-DOSプロンプトでコントロールキー+Cを実行して中断しましょう。MacやMac OS Xはそのままメニューから終了して下さい。
では、リストを見てみましょう。−−まず、今まで触れませんでしたが、クラスの名前についてちょっと注目して下さい。クラス名の1文字目は、いつも大文字になってますね。これは、実は重要なんです。まあ、別にそうでなくてもいいんですけど、Javaでは「クラスは最初の1文字目を大文字の名前にする」というマナーのようなものがあるんです。以後、この点にも注意するようにしましょう。
ではまず、1行目を見ましょう。今まではいきなりクラスの定義から始まっていましたが、ここでは「import」というものから始まっていますね。
このimportというのは、プログラムの中で使用するクラスを宣言するものです。今までのプログラムは、全てJavaのシステム部分がもっている機能だけを使ってきました。他のクラスは使っていなかったので、こうした宣言はいらなかったのです。これは、
import 《パッケージの指定》.《クラス名》;こんな形で行ないます。「パッケージ名」というのは、そのクラスが収めてあるパッケージの名前です。Javaでは非常にたくさんのクラスが用意されていますから、それらをジャンルごとにまとめてあるのです。このクラスのまとまりのことを「パッケージ」といいます。 パッケージは、それぞれバラバラにあるんじゃなくて、ある程度階層的に整理されています。例えば「java」というところに、Javaで標準装備されているパッケージが用意されています。今回使う「awt」というのもその1つです。「javaという場所にあるawtパッケージ」なので「java.awt」というように表現します。
ここで使う「java.awt」というパッケージにはたくさんのクラスが入ってます。それら1つ1つをimportで指定するのは面倒ですね。こういうときに「*」という記号を使います。この「*」はワイルドカードというもので、これを指定すると、そのパッケージの全クラスが使えるようになるのです。
では、この「awt」というのは何か。−−これは、正式名称「Abstract Window Toolkit」というパッケージです。手っ取り早くいえば、GUIの基本であるウィンドウと、その上に配置するさまざまな部品類をまとめてあるパッケージなのです。ウィンドウなどGUIを使う場合には、このパッケージをimportしてやればいいのだ、と考えて下さい。
では、その先のプログラムを見てみましょう。このプログラムでは、クラスの定義ではこんな形になっています。
《Test4について》{ public Test4 () { 《Test4クラスの定義をする》 } public … main () { 《Test4クラスを作成する》 } }すなわち、mainメソッドでは、Test4クラスを新しく生成し、そしてTest4メソッドでは、Test4というクラスの定義を行なっているわけです。「…クラスの定義??」と疑問に思う人もいるでしょうが、とりあえず今は深く追求しない! この構造を頭に入れて、続きを読んでいってくださいね。
では、最初のクラスの定義部分に進みます。これは、こんなふうになっています。
public class Test4 extends Frame {なんか変なものがついてますね。「extends Frame」というのが、クラス名の後についています。これはなんなのでしょう?
これは、「このクラスはFrameというクラスを継承しますよ」という意味なのです。−−何度もいうように、Javaではさまざまなクラスが用意されています。そして、クラスごとに、必要なメソッドをまとめてあるわけです。
では「このクラスはとっても気に入った。だから、新しく作るクラスは、このクラスの全機能をそのまま引き継ぎたい」と思ったとしましょう。こんなときに使うのが「extends」なのです。このextendsでクラスを定義すると、新たに作成されるクラスは、指定されたクラスを継承するのです。
「継承」というのは、あるクラスにあるさまざまな機能を受け継いで新しいクラスを作ることをいいます。あるクラスを継承して新しいクラスを作ると、継承されたクラスの全機能が使えるようになるのです。
ここで継承している「Frame」というのは、awtに用意されている、ウィンドウのクラスです。つまり、Frameというウィンドウのクラスを全部継承してTest4を作れば、Test4は何もプログラムなんかしなくてもウィンドウに関する全機能が最初から用意されてしまうわけです。
では、そのTest4クラスの定義部分を見てみましょう。まず最初にpublic Test4 ()というメソッドからです。これは「このクラスを定義するものだ」といいましたね。要するに、このTest4クラスを利用する時に、具体的に「これこれこういう処理を実行してウィンドウを作るんですよ」ということを書いてあるもの、ってわけです。つまり「初期化」のためのメソッドと考えればいいでしょう。
この初期化用のメソッドは、必ずクラス名と同じ名前のメソッドとして用意する決まりになってます。 また、「void」みたいなものがついてませんね? これも初期化用メソッドの特徴です。まあ、細かいことはおいといて、「そういうメソッドを用意してやるんだ」ということだけ覚えておきましょう。
では、ここではどんなことをやってるでしょうか。ウィンドウを実際に定義するのですからさぞかし大変だろう−−と思ったら、書いてあるのはたったの1行、
super ();
これだけです。何でしょうね、これは?
これは、「継承している親に処理を渡す」という働きをするものです。処理をわたすとどうなるか。ここでは、Frameという、ウィンドウを定義したクラスを継承していますね。ということは、Frameクラスに処理を渡すということになります。Frameクラスには、当然Frameクラスのウィンドウを定義するメソッドが用意されている(はずですよね?)。−−ということは、処理を渡すと、Frameクラスの定義部分がそのまま実行されるわけです。ということは?−−そう、なんだかわかんないけど、ウィンドウの定義はFrameクラスが勝手にやってくれちゃうわけです!
これは実にありがたい機能ですから、しっかりと覚えておきましょう。 ――さあ、これで、あっという間にウィンドウを使ったクラスの定義ができてしまいました。
public static void main (String args []) { Test4 myWindow; myWindow = new Test4 (); myWindow.show (); }
さて、ここは1行ずつ働きを説明していくことにしましょう。
Test4 myWindow;
これは、「myWindow」という変数を定義する部分です。変数の型は「Test4」。そう、Test4クラス型の変数を定義してるんです。
なんか変な感じがしますが、Javaではこんなふうに定義したクラスの型の変数を作ることができます。そしてその変数に新しいクラスを放り込み、その変数を使ってさまざまな操作をするのです。といっても、「myWindow = Test4」としてもダメです。クラスの場合は「new」というものを使って新しいクラスの部品を作り出し、それを設定してやらないといけません。
myWindow = new Test4 ();
こんな具合ですね。これで変数「myWindow」に、新しく生成したTest4クラスを収めます。クラスは、こんな具合に「new 〜」というものを使って新しく生成することができるのです。
このTest4のようなクラス定義というのは、いってみれば「クラスの設計図」みたいなものです。newを実行すると、その設計図を元に、実体のあるクラスが作り出され、変数に収められるのです。クラスを実際に扱うときは、このようにnewで新しいクラスの分身(?)みたいなものを作り出し、それを操作します。直接設計図部分を操作することはできないのです。
この「newで作ったクラスの分身」を「インスタンス」といいます。クラスが設計図なら、これは設計図を元に作った実際の家です。つまり、newでインスタンスを作ると、これは実際に操作できるようになるのですね。
myWindow.show ();
次に、「myWindow」の中のshow ()というメソッドを呼びだし、newで作り出したウィンドウを画面に実際に表示しています。−−え?「なんでmyWindowの中にそんなメソッドがあるんだ? いつ作ったんだ?」ですって? そう疑問をもつ人も多いでしょうね。でも、よく考えてみてください。−−変数myWindowの中には、新しく作ったTest4クラスのインスタンスが入っています。つまり変数myWindowを操作するというのは、そこに入っているTest4クラスを操作する、ということなのです。
そして、Test4クラスは、Frameクラスを継承して作られています。−−そう、わかってきましたね。このFrameクラスに、実はshow ()という「ウィンドウを画面に表示するメソッド」が用意されていたのです。
これで、mainメソッドでどんなことが行なわれていたかわかってきましたね。−−実は、このmainメソッドは、通常はもっと簡単に書きます。
public static void main (String args []) { new Test4 ().show (); }
こんな具合です。Test4をnewすると同時にそのnewしたもののshow ()を呼び出しているわけです。これだけを見るとよくわからないでしょうが、先のように1つ1つ分解して考えれば、どういう働きをしているかわかりますね。
まあ、書くときはこのほうがはるかに簡単ですから、「new 《クラス》.show ();」という書き方をそのまま覚えてしまいましょう。
ウィンドウを使ったクラスの定義と呼び出し方の基本がだいたいわかったでしょうか。では、全てFrameからの借り物だとちょっとつまらないので、少しだけオリジナルのウィンドウのためのつけたしをしてみましょう。−−Test4クラスの定義をしているメソッドを、ちょっと書き足してみます。
public Test4 () { super (); setTitle("Hello"); setSize (300,150); }
これでコンパイルして実行すると、ウィンドウの大きさはもっと大きくなり、タイトルバーに「Hello」と表示されるようになります。
ここでは、2行新しい命令をつけたしていますね。setTitle ()とsetSize ()です。これは、それぞれ以下のような働きをします。
「setTitle (《文字列》)」−−そのクラスのウィンドウタイトルを指定の文字列に変更する
「setSize (《横幅》,《縦幅》)」−−そのクラスの縦横の大きさを変更する
さて、ここでまた疑問が生じます。「なんでこの2つのメソッドにはクラス名がないのか?」ということです。
その理由は、この2つが、Test4クラス自身がもつメソッドだからです。クラス自身がもっているメソッドは、このようにクラス名を書かずに使うことができるのです。
「えっ、いつこんなメソッドを定義したんだ?」−−と思った人、あなたは忘れっぽいですねえ。ほら、Test4はFrameクラスを継承していたんでしょう? そう、もうわかりましたね。これらは継承しているFrameクラスの方で定義してあったんですね。(あるいは、Frameの更に先のほうかも知れませんが…)
Javaでは、こんな具合に、継承しているクラスをどんどんさかのぼって、そこにあるメソッドを使うことができます。だから、Javaのプログラムリストなどを見ていて「あれ〜、こんなメソッド見たことないな?」と思ったら、そのクラスが何を継承しているか、継承しているクラスは更に他のクラスを継承していないか−−と、継承構造をどんどんさかのぼって調べていってください。そうすれば、きっとメソッドを探し出すことができるはずですよ。