●前回はJFrameというもともとあるクラスをそのまま利用しました。Javaにはこの他に自分で機能を付け加えてあらたに別のクラスをつくって使うという使い方があります。
●前回は javax.swing の中にある、JFrame というクラス(ライブラリ)を使って、フレームを作りました。
●使用法は new JFrame() を使用して自分が利用するフレームを作って frame1 と名前を付け、それに対して、frame1.setSize() のように指示をだすというものでした。
/* フレームを作成 */ JFrame frame1 = new JFrame(); /* サイズと位置を指定 */ frame1.setSize(400, 300); /* 終了処理を設定 */ frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); /* 実際に表示する */ frame1.setVisible(true);
●オブジェクト指向の言葉では、new JFrame() をコンストラクタを使って、オブジェクト(インスタンス)をつくり、setSize などのメソッドを使って、設定をしたということになります。setSizeなどはもともと JFrame というクラスにある機能でJFrameのオブジェクトを作ることで、オブジェクトに適用できるようになります。
●クラスは自分で作成して利用することもできます。(というより、java のプログラミングはクラスの作成そのものですが)そのとき、すでにあるクラスに、必要な機能を付け加えて利用することができます。この時もともとのクラスの持っている機能はそのまま使えます。これを継承 と呼びます。
●継承によってできたクラスをサブクラス、元になったクラスをスーパークラスといいます。サブクラスの方が拡張されている分、機能的にはスーパーなのですが、名前がサブ。機能と名前のイメージが違うので注意が必要です。
import javax.swing.*;
/** JFrame の拡張 */
public class Swing01 extends JFrame{
/** コンストラクタ ************/
public Swing01(){
/* サイズと位置を指定 */
setSize(400, 300);
/* 終了処理を追加 */
setDefaultCloseOperation(EXIT_ON_CLOSE);
/* 実際に表示する */
setVisible(true);
}
/** main ***********************/
public static void main(String[] args){
/* 拡張されたフレームを作成 */
Swing01 frame1 = new Swing01();
}
}
● extends JFrameは、Swing01 が JFrame を継承してつくったことを宣言します。
●次の行、public Swing01(){ で始まるブロックはコンストラクタといい、あとで new でオブジェクトが作られるときにどのような機能を持たせるかの定義を行う部分です。いわばオブジェクトの設計図です。
●JFrameには大きさの指定がなく。オブジェクトを作ってからあとでframe1.setSize(400, 300);で指定しました。ここではコンストラクタにsetSize(400, 300);を書いて、いちいち指示しなくてもよくしました。また、[×]ボタンで終了することや、見えるようにすることもいちいち指示しなくてもよくしました。
●もともとJFrameを継承しているのでこのコンストラクタはJFrameのコンストラクタを使ってフレームを作ります。これは書かなくてもいいので楽です。その上にいろいろ付け加えて拡張機能をもったSwing01クラスを作ったということになります。
●コンストラクタのブロックの後にやっと main の部分が出てきます。javaではプログラムを実行するときに、この main から始めます。この上にあった Swing01クラスは main の中から呼ばれるまでは実行されません。
●main の中にはたったひとつ、Swing01クラスのオブジェクトを new を使って生成しそれにframe1という名前を付けているだけです。これで Swing01 のコンストラクタが呼び出され、拡張されたフレームが作られ、表示までされます。
●前回のプログラムと全く同じ機能です。結果だけ見ればつまらないですし、プログラムの中身も似たようなものに写るかも知れません。でも考え方はまるで違います。
●それは自分のクラスライブラリを作ったからです。プログラムの中に、依然として main があるので、しっくり来ないのですが、この Swing01 というクラスは、別のプログラムからも、new Swing01() として利用することができます。
●次のようなプログラムを作って実行しても同様の結果を売ることができます。
public class UseSwing01 { public static void main(String[] args){ /* 拡張されたフレームを作成 */ Swing01 frame1 = new Swing01(); } }
●このような使い方をするときには、Swing01.java に main の部分は必要ありません。
import javax.swing.*;
/** JFrame の拡張 */
public class Swing01 extends JFrame{
/** コンストラクタ ************/
public Swing01(){
/* サイズと位置を指定 */
setSize(400, 300);
/* 終了処理を追加 */
setDefaultCloseOperation(EXIT_ON_CLOSE);
/* 実際に表示する */
setVisible(true);
}
/** 他から呼ばれるだけならmainはいらない****/
}
●前回 JFrame を利用したと同様に Swing01 を使うことができるのです。今回は動作テストのため、たいした機能を拡張していませんが、この方法は大規模なプログラムを作るときは大変な力になります。
●他から呼び出して使うと考えて、上記のようにmainを別にしてもいいのですが、小さなプログラムの場合、普通は面倒なのでmainもひとつのファイルにまとめてしまいます。大きなプログラムでも、起動するだけのmainにしてしまってテスト用にしておくと便利なことがあります。
●作成するクラスにどのような機能をもたせ、どの部分を main から指定していくか、これはとても大事なことです。これを上手に設計するとプログラムの流れが理解しやすくなり、間違いのないプログラムを書くことができます。