コンポーネント作成の基本を覚える


前回、クラスとインスタンス利用のサンプルとして、AWT(Abstract Window Toolkit)という標準で付属するクラス群を使ってウインドウを表示するプログラムを作成しました。Javaには、標準でこのAWTと「Swing」という2つのGUIライブラリが付属します。AWTは非常にシンプルで使いやすいライブラリで、Swingは非常に高機能で柔軟なライブラリです。機能的にはSwingのほうがはるかに上なのですが、最初に覚えるにはシンプルなAWTのほうがよいでしょう。そこで、このAWTの基本を今回は覚えることにしましょう。では、さっそくAWTを使ったごくシンプルなプログラムを作成してみます。

import java.awt.*;

public class Sample extends Frame {

  public static void main(String[] args){
    new Sample();
  }
  
  public Sample(){
    this.setSize(200,100);
    this.setVisible(true);
  }
}
プログラムを実行すると、真っ白いウインドウが画面に現れます。


これをコンパイルし実行すると、白い小さなウインドウが画面に表示されます。これは、ただウインドウが表示されるだけで何もできないプログラムです。終了さえできませんから、コマンドプロンプトからCtrlキー+「C」キーを押して強制終了で終えてください。

ここでは、新たに登場するJavaの機能がいくつか見られます。それらについて簡単に説明しておきましょう。これらがわかれば、サンプルプログラムの働きはだいたい理解できるはずですよ。

●importについて
冒頭に「import java.awt.*;」という文が見えますね? これは「所定のパッケージにあるクラスを名前だけで利用できるようにするためのもの」です。Javaでは、それぞれのクラスを名前で識別しています。ということは、たくさんのクラスを利用するようになると、同じ名前のものが2つあったりするような状況も考えられるわけです。そうなると「同じ名前のクラスがあるからこのプログラムは使えない」というような問題が起こりかねません。

そこで、Javaでは「パッケージ」と呼ばれるものを使ってクラスを階層的に管理できるようにしています。例えば、jp.tuyanoというパッケージの中に「Window」というクラスを用意するならば、「jp.tuyano.Window」というように記述して利用するわけです。こうすれば、別の「jp.taro」というパッケージに同じWindowクラスがあっても、ちゃんと区別することができますね。このように、Javaのプログラムはそのプログラムやプロジェクト、開発もとの企業や個人などごとに異なるパッケージを用意し、その中にクラスを作成することが多いのです。

これで「同じ名前のクラスがある」という問題を回避することはできるようになりました。が、別の問題も起こります。それは「クラスの名前が長ったらしくなる」ということです。クラスのインスタンスを作るのに「jp.tuyano.Window A = new jp.tuyano.Window();」なんて毎度毎度書かないといけないとしたら、これはかなり疲れます。

そこで、「あらかじめ宣言しておいたクラスは、パッケージの指定をしなくても名前だけで使えるようにしよう」ということで用意されたのがimportなのです。例えば「import jp.tuyano.Window;」と記述しておけば、後はこのクラスを利用する際にも「Window A = new Window();」というようにクラス名だけで使えるようになります。

ここでは「import java.awt.*;」という文が書いてありますね。この「java.awt」というパッケージは、AWTに用意されているさまざまな部品類(コンポーネントと呼びます)のクラスがまとめられているパッケージです。また、「*」という記号は「すべての要素」を示すもの(ワイルドカードと呼びます)です。つまり「import java.awt.*;」とすることで、java.awtパッケージにあるすべてのクラスを名前で利用可能にしていたのですね。

●extendsについて
これは「継承」と呼ばれる、Javaのもっとも重要な機能に関するものです。継承とは、あるクラスの機能をそのまま受け継いで新しいクラスを作ることをいいます。例えば、ウインドウのクラスがあったとき、そのウインドウの機能を少しだけ変えたい、と思ったとしましょう。そんなとき、また一からウインドウのクラスを作るのはバカげています。既にウインドウのクラスがあるのにまた作らないといけないなんて!

そこでJavaでは、既にあるウインドウのクラスを継承し、新しいクラスを定義できるようにしたのです。継承した新しいクラスでは、継承元のクラスにある機能はすべて自動的に受け継がれます。後は、修正したい機能を付け加えるだけで、新しいウインドウのクラスができてしまうというわけです。この継承を利用するときは、クラスを定義する際に以下のように記述をします。

class クラス名 extends 継承するクラス {・・・]


ここでは「extends Frame」というようにしてクラスが作られていますね? これは、Frameというクラスを継承して新しいクラスを作ることを意味します。Frameというのは、java.awtパッケージに用意されているクラスで、一般的なウインドウの機能を提供するクラスです。つまり、extends Frameとして定義をすることで、新しいウインドウのクラスを作っていたのですね。

●コンストラクタについて
サンプルのSampleクラスでは、ちょっと見慣れないメソッドが定義されていました。Sampleというメソッドですが、このメソッド、何か変ではありませんか? よく見ると、返値の指定がないのです。普通は、「public void Sample()……」というように返値の指定が必ずあるはずですが、ここでは「public Sample()……」となっていますね。

これは、「コンストラクタ」と呼ばれる特別なメソッドなのです。コンストラクタというのは「そのクラスのインスタンスを作成するときの初期化処理」を行うための専用メソッドです。クラスは、newを使ってインスタンスを作成しますね? このnewでインスタンスを作成しようとすると、Javaはそのクラスに用意されているコンストラクタを検索し実行します。つまり、コンストラクタにさまざまな処理を記述しておけば、インスタンスを作成する際に必ずそれが実行される、というわけです。

ここでは、以下の2つのメソッドを実行していますが、これらはウインドウの初期化で多用されるメソッドですので覚えておきましょう。

[インスタンス].setSize( 横幅 , 縦幅 );

このインスタンスの大きさを設定します。引数には、縦横のドット数を示す整数値を指定します。Frameを継承したクラスならば、これでウインドウの大きさが変更されます。

[インスタンス].setVisible( boolean値 );

そのインスタンスによるコンポーネントを画面に表示します。Frameを継承したクラスの場合、newした段階ではウインドウは非表示の状態になっています。このメソッドでtrueに設定して、初めてそのウインドウが画面に表示されます。