以前も述べたが、GUI を使ったプログラムの開発は結構手間がかかって大変で ある。最近のプログラミング言語では、オブジェクト指向に基づいたクラス・ラ イブラリィを利用することで、この困難さと折り合いをつけている。Java も例 外ではない。
一応、真似をするに足るプログラム DoNothingAWT4.java もそれな りに複雑なので、段階を追って説明する。
ウィンドウを出すためのクラス Frame を、とにかく使ってウィンドウを出し てみたのが次のプログラム DoNothingAWT1.java である。
DoNothingAWT1.java |
1 /* 2 * DoNothingAWT1.java --- AWT でとにかくウィンドウを作る 3 * (ひどいプログラムなので良い子は真似をしてはいけない) 4 */ 5 6 import java.awt.*; 7 8 public class DoNothingAWT1 { 9 public static void main(String args[]) { 10 Frame f = new Frame(); 11 f.setSize(300, 300); // これがないとやたら小さいウィンドウになる 12 f.show(); // これがないとウィンドウを出さずに即終了 13 } 14 } |
これは、まともに終了することが出来ない。Close を選択してもダメ。 きちんと終了させるには、そのためのコードが必要。 そういう修正をしたのが、次の DoNothing2.java である。
DoNothing2.java |
1 /* 2 * DoNothingAWT2.java --- AWT でとにかくウィンドウを作る 3 * (終了できるようになったが、全然発展性のない、ダメなプログラム) 4 */ 5 6 import java.awt.*; // Frame 7 import java.awt.event.*; // WindowAdapter 等 8 9 public class DoNothingAWT2 { 10 public static void main(String args[]) { 11 Frame f = new Frame(); 12 // ちゃんと終了できるように 13 f.addWindowListener(new WindowAdapter() { 14 // 次の名前をミス・スペルすると、分かりにくいバグになる 15 public void windowClosing(WindowEvent e) { 16 System.exit(0); 17 } 18 }); 19 f.setSize(300, 300); // これがないとやたら小さいウィンドウになる 20 f.show(); // これがないとウィンドウを出さずに即終了 21 // このウィンドウの中で何かをしようと思っても…できない! 22 } 23 } |
13〜18 行目の文 (一つの文です!) に注目。しばらくは、 これはとにかくこういうものだと覚えてしまうこと (どう書くかは簡単に 覚えられないだろうが、とにかくコピーすれば良い)。
とにかくウィンドウを出して、終了できるようになったが、実は発展性 0 の プログラムである。Frame というのは、あくまでも雛形であって、 そのまま使うものではない。 「Frame を継承したクラスを作って、 それで自分がやりたいことを出来るようにして行く」 のが普通のやり方である。
次のプログラム DoNothing3.java はそれを素直に実現したものである。 Frame のサブクラス MyWindow を作って、main() の中で、 MyWindow のインスタンス (オブジェクト) を作っている。
DoNothing3.java |
1 /* 2 * DoNothingAWT3.java --- AWT でウィンドウを作る 3 * (最低限の発展性はある) 4 */ 5 6 import java.awt.*; // Frame 7 import java.awt.event.*; // WindowAdapter 等 8 9 // Frame を継承したクラス MyWindow を作る。 10 class MyWindow extends Frame { 11 // MyWindow クラスのコンストラクター 12 MyWindow() { 13 setSize(300, 300); 14 addWindowListener(new WindowAdapter() { 15 public void windowClosing(WindowEvent e) { 16 System.exit(0); 17 } 18 }); 19 // 例えば、ここから下に自分のやりたいことが書ける!! 20 } 21 } 22 23 public class DoNothingAWT3 { 24 public static void main(String args[]) { 25 Frame f = new MyWindow(); 26 f.show(); 27 } 28 } |
ところが、最近の Java のテキストでは、このような書き方はせずに、 次の DoNothing4.java のように書いてあるプログラムが多い (クラスの中のメソッド main で、 インスタンスを生成している -- 例えば C++ などで オブジェクト指向プログラミングに慣れている人でも、 違和感を感じる人が多いようだ)。
DoNothing4.java |
1 /* 2 * DoNothingAWT4.java --- AWT でウィンドウを作る 3 * 一つのクラスで済ませてしまう --- 気持ち悪がる人もいる書き方だが流行 4 */ 5 6 import java.awt.*; // Frame 7 import java.awt.event.*; // WindowAdapter 等 8 9 public class DoNothingAWT4 extends Frame { 10 DoNothingAWT4() { 11 setSize(400, 400); 12 addWindowListener(new WindowAdapter() { 13 public void windowClosing(WindowEvent e) { 14 System.exit(0); 15 } 16 }); 17 // この下に自分のやりたいことが書ける!! 18 } 19 public static void main(String args[]) { 20 // 自分で自分を産むみたいで気持ちが悪いという人はオジサンなのか? 21 Frame f = new DoNothingAWT4(); 22 f.show(); 23 // ちなみに、この後 24 // Frame g = new DoNothingAWT4(); g.show(); 25 // とすると、もう一つウィンドウを出せます。 26 } 27 } |