2002 -0721 ver 1.00 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃.&&&& **** %%%%.  JavaScript&Javaで目指そう!基本情報技術者試験  ┃ ┃&&&&&&******%%%%%%  執筆&編集 斎藤末広 suehiro@he.mirai.ne.jp  ┃ ┃'&┃&''*┃*''%┃%'  発行    江口昌宏 jmaga@yscon.co.jp    ┃ ┗━┻━━┻━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ★解除・登録 広告募集:http://www2.odn.ne.jp/~egu33/jmaga/java-maga.html ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓  第23号 2002/07/21  アプレット復習 ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛  プログラムを作成する上での注意事項:  Windows98SE, SDK(JDK) 1.3.1,IE 5.5 を前提としています。  拡張子を表示するに設定してください。 ------------------------------------------------------------------------ ▼ アプレットの復習  第15号からアプレットのプログラムを扱ってきました。"Hello, World" の 表示に始まって,画像の表示,色の扱い,マウス,キーボード,ボタンのイベン ト処理と扱い,複雑になってきましたので,この号では,復習をかねて整理をし ましょう。 ------------------------------------------------------------------------ ▼ アプレットは,WEB ページに表示される  今まで扱った,アプレットの一番難しい例と一番簡単な例を比較してみましょ う。両方とも動作させて見て下さい。  難しい方の例は,ボタンを押すと画像が移動します。簡単の方の例は,文字列 "Hello, World"と表示するだけのアプレットです。 難しい例 xSmpGUI03.java ソース http://www.yscon.co.jp/j/java/jmaga/j22/xSmpGUI03.java 動作  http://www.yscon.co.jp/j/java/jmaga/j22/xSmpGUI03.htm 1: import java.applet.Applet; 2: import java.awt.Graphics; 3: import java.awt.Image; 4: import java.awt.event.ActionListener; // ボタン係 5: import java.awt.Button; // ボタン(表ボタン,見た目を作る) 6: import java.awt.event.ActionEvent; // ボタンセンサ(裏ボタン,黒子) 7: 8: public class xSmpGUI03 extends Applet{ 9: 10: Image ximg; 11: int x, y; 12: 13: Button xbt01 = new Button("←"); // 表ボタン生成 14: Button xbt02 = new Button("→"); 15: 16: class xButtonAdapter implements ActionListener{ 17: public void actionPerformed(ActionEvent xbs){ 18: if (xbs.getSource() == xbt01){ 19: x = x - 10; //ボタン係01のやる仕事 20: } 21: if (xbs.getSource() == xbt02){ 22: x = x + 10; //ボタン係02のやる仕事 23: } 24: repaint(); 25: } 26: } 27: 28: xButtonAdapter xia01 = new xButtonAdapter(); //ボタン係01生成 29: xButtonAdapter xia02 = new xButtonAdapter(); //ボタン係02生成 30: 31: public void init(){ 32: ximg = getImage(getDocumentBase(),"img01.gif"); 33: x = 0; y = 0; 34: 35: add(xbt01); //表ボタンを本体プログラムの画面に貼付 36: add(xbt02); 37: 38: xbt01.addActionListener(new xButtonAdapter()); 39: // 表ボタンが自分のボタン係任命 40: xbt02.addActionListener(new xButtonAdapter()); 41: } 42: 43: public void paint(Graphics xg){ 44: xg.drawImage(ximg, x, y, this); //画面を表示 45: } 46: } 簡単な例 xHelloApplet.java ソース http://www.yscon.co.jp/j/java/jmaga/j15/xHelloApplet.java 動作  http://www.yscon.co.jp/j/java/jmaga/j15/xHello.htm 1: import java.applet.Applet; 2: import java.awt.Graphics; 3: 4: public class xHelloApplet extends Applet { 5: public void paint(Graphics xg){ 6: xg.drawString("Hello, World",100, 120); 7: } 8: } 9:  アプレットは,この様に,ウェブページに,四角枠で,場所を確保して,そこ で動作するプログラムを指します。  簡単な例の方の html ソースも見てみましょう。 xHello.htm

  のところで,ウェブページ上に,アプレットが動作するエ リアを配置しています。この長方形の大きさは,  width = 300 height = 200  で,高さが 300 ピクセル,200 ピクセルと指定されています。ピクセルという 単位は,解像度で表わされる点のことです。多くのパソコンでは,横 1024 ピクセル 縦768ピクセルですね。長方形は,コンピュータグラフィックの世界では矩形(く けい)と言われます。今後は,長方形と言わずに矩形といいます。  アプレットの最大の特色は, ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ アプレットは,ウェブページに矩形で表示されて,そこで実行される。  ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ------------------------------------------------------------------------ ▼ アプレットの本質 その2 Applet の子供  xHelloApplet.java で,最初の import(輸入) してくるものは,Applet クラス です。この Applet クラスを import(輸入)して,4 行目で 4: public class xHelloApplet extends Applet { として利用してます。アプレットのプログラムは,Applet クラスを extends(拡 張)しているからこそ,アプレットと呼ばれています。Jマガでは,プログラムと してのアプレットは,カタカナでアプレットと呼び,クラスとしての Applet は, 英語で書いています。  難しい方のプログラムでも,1行目で import して,8行目で このプログラム を Applet クラス を拡張して,xSmpGUI03 とすると定義しています。 8: public class xSmpGUI03 extends Applet{  アプレットとしての動作は,この Applet クラスで決められています。extend というのは,日本語にすると,「拡張」です。Applet を拡張して,xHelloApplet や xSmpGUI03 を作成します。この場合,Applet を親,拡張されて出来たものを, 子と呼びます。親である Applet クラスを子である xHelloApplet や xSmpGUI03 が 性質を引き継ぎます。オブジェクト用語では,この引き継ぎを「継承」と呼びます。 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃     アプレットは,Applet クラスを継承している。         ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ------------------------------------------------------------------------ ▼ アプレットの本質 最大の仕事は  アプレットが実行する関数(メソッド)はたくさんありますが,しかし,実際 に実行するのは,多くはありません。  複雑な方のプログラムを見て下さい。 1: import java.applet.Applet; 2: import java.awt.Graphics; 3: import java.awt.Image; 4: import java.awt.event.ActionListener; // ボタン係 5: import java.awt.Button; // ボタン(表ボタン,見た目を作る) 6: import java.awt.event.ActionEvent; // ボタンセンサ(裏ボタン,黒子) 7: 8: public class xSmpGUI03 extends Applet{ 9: 10: Image ximg; 11: int x, y; 12: 13: Button xbt01 = new Button("←"); // 表ボタン生成 14: Button xbt02 = new Button("→"); 15: 16: class xButtonAdapter implements ActionListener{ 17: public void actionPerformed(ActionEvent xbs){ 18: if (xbs.getSource() == xbt01){ 19: x = x - 10; //ボタン係01のやる仕事 20: } 21: if (xbs.getSource() == xbt02){ 22: x = x + 10; //ボタン係02のやる仕事 23: } 24: repaint(); 25: } 26: } 27: 28: xButtonAdapter xia01 = new xButtonAdapter(); //ボタン係01生成 29: xButtonAdapter xia02 = new xButtonAdapter(); //ボタン係02生成 30: 31: public void init(){ 32: ximg = getImage(getDocumentBase(),"img01.gif"); 33: x = 0; y = 0; 34: 35: add(xbt01); //表ボタンを本体プログラムの画面に貼付 36: add(xbt02); 37: 38: xbt01.addActionListener(new xButtonAdapter()); 39: // 表ボタンが自分のボタン係任命 40: xbt02.addActionListener(new xButtonAdapter()); 41: } 42: 43: public void paint(Graphics xg){ 44: xg.drawImage(ximg, x, y, this); //画面を表示 45: } 46: }  仕事(メソッド)をみましょう。仕事は関数として登場します。 13: Button xbt01 = new Button("←"); // 表ボタン生成 14: Button xbt02 = new Button("→"); 13と14行目の Button() メソッドは,コンストラクタという特別なメソッド(関 数)で,Button クラスにやってもらいます。 16: class xButtonAdapter implements ActionListener{ 17: public void actionPerformed(ActionEvent xbs){ 18: if (xbs.getSource() == xbt01){ 19: x = x - 10; //ボタン係01のやる仕事 20: } 21: if (xbs.getSource() == xbt02){ 22: x = x + 10; //ボタン係02のやる仕事 23: } 24: repaint(); 25: } 26: }  は,この xSmpGUI03の内部に xButtonAdapter というクラスを定義しています。 actionPerformed()という仕事をここで定義しており,実行するときは, xButtonAdapter クラスかその分身が実行します。  18 行目に書いてある,xbx.getSource() は,xbx が実行します。  24 行目の repaint() は,xButtonAdapter クラスが xSmpGUI03 に依頼する仕 事です。xSmpGUI03 は,repaint() という仕事をしようとしますが,なにをして いいのかわからないため,xSmpGUI03 の親である Applet クラスに実行を依頼し ます。Applet クラスでこの仕事は定義されています。大まかな内容は,画面に表 示するための準備をしてから,paint()をしろと子供のクラスにメッセージを出し ます。 28: xButtonAdapter xia01 = new xButtonAdapter(); //ボタン係01生成 29: xButtonAdapter xia02 = new xButtonAdapter(); //ボタン係02生成  xButtonAdapter() は,これもコンストラクタです。xButtonAdapter クラスに やってもらいます。 31: public void init(){ 32: ximg = getImage(getDocumentBase(),"img01.gif"); 33: x = 0; y = 0; 34: 35: add(xbt01); //表ボタンを本体プログラムの画面に貼付 36: add(xbt02); 37: 38: xbt01.addActionListener(new xButtonAdapter()); 39: // 表ボタンが自分のボタン係任命 40: xbt02.addActionListener(new xButtonAdapter()); 41: } init()という仕事(メソッド)を定義しています。この init()は,xSmpGUI03 自身の仕事です。Applet クラスに,アプレットしての動作をするときには, 最初にやる仕事であると定義されています。xSmpGUI03 は,親クラスに言われて 自分が動作するときに,最初に init() を実行します。  32 行目の getImage() は,xx.getImage()と書いてありませんし,また, クラス定義の中に書かれていません。そういう場合は,親のAppletクラスが実行 してくれます。絵を探してきて,それを ximg に覚えさせます。  35, 36 の add()も,親の Applet クラスが実行してくれます。xSmpGUI03 の 体に xbt01 と xbt02 を追加してます。  38,40 の addActionLinster()は,Buttonクラスの分身(インスタンス)である, xbt01とxbt02にやってもらってます。  xButtonAdapter() は,コンストラクタで,xButtonAdapter クラスにやって もらっています。 43: public void paint(Graphics xg){ 44: xg.drawImage(ximg, x, y, this); //画面を表示 45: } 46: }  では,paint()を定義しています。これは,xSmpGUI03 が自分で実行します。 実行するタイミングは,親である,Applet クラスに書いてあいます。先ほど 登場した,repaint() から,親経由で強制的に実行されます。動作する基本的な タイミングは,Applet クラスで管理しています。  44行目の,xg.drawImage()は,Graphics クラスの分身(インスタンス)である xg にやってもらいます。  以上,どの仕事(メソッド)をだれがやるかを見ました。xSmpGUI03 自身が 実行する仕事は,  paint()  init()  でした。  init()は,paint() を実行するまえに準備する仕事です。paint()が,xSmpGUI03 の中心の仕事と言えます。  ここで,簡単な方の例を見ましょう。 1: import java.applet.Applet; 2: import java.awt.Graphics; 3: 4: public class xHelloApplet extends Applet { 5: public void paint(Graphics xg){ 6: xg.drawString("Hello, World",100, 120); 7: } 8: } 9:  xHelloApplet が実行する仕事は,paint()しか登場していません。もし, paint()が無ければ,実質的にアプレットはなにも仕事をしないことになります。 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃    アプレットの最大の仕事は,paint() である。           ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃    init() は,paint() の準備をする。               ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃    repaint() は,親経由で,paint() を実行する。         ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ さらに,アプレットを表示するウェブページのタグの役割は ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃    タグは,paint() で表示されるエリアを確保する。    ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ と言えます。 ------------------------------------------------------------------------ ▼ アプレットの本質 Applet とともに  init() が動作するタイミング,paint()の動作するタイミング,add() がどん な仕事をするかは,親である Applet クラスで定義してありました。つまり, xSumGUI03 や xHellApplet が動作するときは裏で Applet が一生懸命働いていま す。 xHelloApplet.java ソース http://www.yscon.co.jp/j/java/jmaga/j15/xHelloApplet.java 動作  http://www.yscon.co.jp/j/java/jmaga/j15/xHello.htm 1: import java.applet.Applet; 2: import java.awt.Graphics; 3: 4: public class xHelloApplet extends Applet { 5: public void paint(Graphics xg){ 6: xg.drawString("Hello, World",100, 120); 7: } 8: } 9:  で,import のところで,Applet クラスと Grahics クラスが import(輸入) されていました。この import というのは,プログラムの中で,使う部品を表すと 同時に,xHelloApplet が動作するときは,裏で同時に動作してもらうクラスを 示しています。  Applet クラスは,xHelloApplet の親として動作してもらいます。これは, 孫悟空とお釈迦様の関係で,xHelloApplet が孫悟空で,Applet クラスがお釈迦 様です。xHelloApplet は,Applet クラスの手のひらの上で動作しています。  Graphics クラスも,xHelloApplet が動作するときに,裏で同時に動作してい ます。こちらは,Applet クラスとの関係を親子関係とすると,友達の関係です。 こちらは,本体(クラス)が直接動作せずに,分身(インスタンス)が代わりに仕 事をします。6 行目の 6: xg.drawString("Hello, World",100, 120);  は,Graphics の分身である,xg に仕事 drawString をしてもらっています。 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃   アプレットは,Applet クラスの手のひらの上で動く。        ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛  アプレットの中心の仕事は,paint() でした。この paint() 内で実際に仕事 をしてくれるのは,友達の Graphics クラスでした。 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃   アプレットの親友は,Graphics クラスである。           ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ------------------------------------------------------------------------ ▼ アプレットの友人たち  難しい方のサンプルをみて,どんな友人(クラス)が登場しているか見てみましょ う。 xSmpGUI03.java ソース http://www.yscon.co.jp/j/java/jmaga/j22/xSmpGUI03.java 動作  http://www.yscon.co.jp/j/java/jmaga/j22/xSmpGUI03.htm 1: import java.applet.Applet; 2: import java.awt.Graphics; 3: import java.awt.Image; 4: import java.awt.event.ActionListener; // ボタン係 5: import java.awt.Button; // ボタン(表ボタン,見た目を作る) 6: import java.awt.event.ActionEvent; // ボタンセンサ(裏ボタン,黒子) 7: 8: public class xSmpGUI03 extends Applet{ 9: 10: Image ximg; 11: int x, y; 12: 13: Button xbt01 = new Button("←"); // 表ボタン生成 14: Button xbt02 = new Button("→"); 15: 16: class xButtonAdapter implements ActionListener{ 17: public void actionPerformed(ActionEvent xbs){ 18: if (xbs.getSource() == xbt01){ 19: x = x - 10; //ボタン係01のやる仕事 20: } 21: if (xbs.getSource() == xbt02){ 22: x = x + 10; //ボタン係02のやる仕事 23: } 24: repaint(); 25: } 26: } 27: 28: xButtonAdapter xia01 = new xButtonAdapter(); //ボタン係01生成 29: xButtonAdapter xia02 = new xButtonAdapter(); //ボタン係02生成 30: 31: public void init(){ 32: ximg = getImage(getDocumentBase(),"img01.gif"); 33: x = 0; y = 0; 34: 35: add(xbt01); //表ボタンを本体プログラムの画面に貼付 36: add(xbt02); 37: 38: xbt01.addActionListener(new xButtonAdapter()); 39: // 表ボタンが自分のボタン係任命 40: xbt02.addActionListener(new xButtonAdapter()); 41: } 42: 43: public void paint(Graphics xg){ 44: xg.drawImage(ximg, x, y, this); //画面を表示 45: } 46: }  どんな友人が登場するかは,import のところを見れば分かります。 1: import java.applet.Applet; 2: import java.awt.Graphics; 3: import java.awt.Image; 4: import java.awt.event.ActionListener; // ボタン係 5: import java.awt.Button; // ボタン(表ボタン,見た目を作る) 6: import java.awt.event.ActionEvent; // ボタンセンサ(裏ボタン,黒子)  1 行目では,親クラスである Applet登場  2 行目では,親友の Graphics クラス登場  3 から 6 行目で,Imageクラス,ActionLister クラス,Button クラス, ActionEvent クラスが登場しています。(厳密には,ActionListerは,クラスに よく似ていますが,クラスではなく,interface といいます。しばらく,Jマガ ではクラスとして扱うことにします。)  たいていのクラスは,仕事をするとき,クラス自身が直接するのではなく,分 身(インスタンス)がやります。その分身は, 10: Image ximg; とか 43: public void paint(Graphics xg){  のかっこ中のように,名前が付けられます。  10 行目では,Image クラスの分身を ximg とするとしています。  43 行目では,Graphics クラスの分身を xg とするとしています。  この友人が仕事をするときは, 38: xbt01.addActionListener(new xButtonAdapter());  のように,ピリオド前で,だれがやるかが示されます。この行では,Button の 分身の xbt01 が実行します。 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃   import を見れば,登場する友達(クラス)が分かる。         ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃  仕事(メソッド)の前に,ピリオドがあれば,実行する友達が分かる。  ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ------------------------------------------------------------------------ ▼ ピリオドが付いていないメソッドはだれが実行するか?  難しい例の方の 24: repaint();  は,ピリオドをつけてだれが実行するか明確にしていません。この repaint() は,だれが実行するか,どう判断するのでしょうか?  すでに,これは,xSmpGUI03 の親が実行するとこの号で書きました。このから くりを説明します。  だれがやるか明示していないものは,それが書いてあるところのクラスの仕事 になります。そこのクラスに,その仕事の定義が書いてあるか調べます。 16: class xButtonAdapter implements ActionListener{ 17: public void actionPerformed(ActionEvent xbs){ 18: if (xbs.getSource() == xbt01){ 19: x = x - 10; //ボタン係01のやる仕事 20: } 21: if (xbs.getSource() == xbt02){ 22: x = x + 10; //ボタン係02のやる仕事 23: } 24: repaint(); 25: } 26: }  repaint() が書いてあるのは,xButtonAdapter クラスの内部です。16行目の 16: class xButtonAdapter implements ActionListener{  は,xButtonAdapter クラスをこのように定義すると,書き始めています。この クラスの定義は,26 行目の } で終了しています。この xButtonAdapter の仕事 は,actionPerformed() で,その仕事内容は,18 行目から24 行目で書いてあり ます。24 行目で repaint() をするとか書いてありますが,どういう仕事かは, この xButtonAdapter クラスでは書いていません。このように書いてないときは, さらにxButtonAdapter クラスがあるところの外のクラスをみます。外のクラスで ある,xSmpGUI03 をみます。  xButtonAdapter クラスは,import されずに,xSmpGUI03 の中で書かれていま ます。こういうクラスを内部クラスといいます。xSmpGUI03 の内部で定義されて いるクラスだから,内部クラスです。 8: public class xSmpGUI03 extends Applet{  xSmpGUI03 は,こういうクラスであると,ここから始まります。このクラスの 定義は, 46 行目の } までです。  xSmpGUI03 の中では,repaint() がどんな仕事をするかの定義がありません。 その場合,この仕事を xSmpGUI03 の親クラスの仕事になります。 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃  だれが実行するのが不明な仕事(メソッド)は,そこのクラスか実行する。┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ クラスに仕事の内容が書いてない仕事は,そのクラスが書いてある外枠の ┃ ┃ クラスが実行する。外枠が無いときは,親が実行する。         ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛  ここで登場した repaint() は,まず,だれがやるか明示してなかったので, xButtonAdapter クラスがやるのではと調べて,そこにはどういう仕事をするかが 書いてありませんでした。その外枠のクラスで,reapint()の定義があるかを見る とそこにもありません。ですから,その親に書いてあるに違いないと考えました。 もし,その親(さらその親)にも仕事の内容が書いて無ければ,コンパイル時に エラーとなります。丁度,repaint() を実行しよという命令が,xButtonAdapter クラスで出されて,その外の xSmpGUI03 クラスで受け取ってもらえずに,さらに その親まで,流れてそこで受け取ってもらって,実行されると言う感じです。そ こですこし仕事をして,次は,paint()をやれと命令が戻ってきます。 ------------------------------------------------------------------------ ▼ クラスの中にクラスを書くことができる。  すでに,難しい方の例で見ましたが,クラスの中にクラスを書くことができま した。それをここで確認してます。  まず簡単な方の例をみます。 xHelloApplet.java ソース http://www.yscon.co.jp/j/java/jmaga/j15/xHelloApplet.java 動作  http://www.yscon.co.jp/j/java/jmaga/j15/xHello.htm 1: import java.applet.Applet; 2: import java.awt.Graphics; 3: 4: public class xHelloApplet extends Applet { 5: public void paint(Graphics xg){ 6: xg.drawString("Hello, World",100, 120); 7: } 8: } 9:  Java のプログラムは,4 行目に書いてあるように,すべて,class として 定義されます。4 行目では,このプログラムは,xHelloApplet クラスであると名 前をつけています。これを保存するソースファイル名は,xHelloApplet.java で コンパイルすると,xHelloApplet.class となりました。 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃      Java では,プログラムはクラスである。           ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃      クラスの拡張子は,class である。             ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛  難しい方の例では, xSmpGUI03.java ソース http://www.yscon.co.jp/j/java/jmaga/j22/xSmpGUI03.java 動作  http://www.yscon.co.jp/j/java/jmaga/j22/xSmpGUI03.htm 1: import java.applet.Applet;                       (ここ間は省略) 8: public class xSmpGUI03 extends Applet{                       (ここ間は省略) 15: 16: class xButtonAdapter implements ActionListener{                       (ここ間は省略) 26: } 27:                       (ここ間は省略) 31: public void init(){                       (ここ間は省略) 41: } 42: 43: public void paint(Graphics xg){                       (ここ間は省略) 45: } 46: }  で,  xSmpGUI03 クラスの内部で,xButtonAdapter クラスが定義されており,xSmpGUI03 クラスでは,init() と paint() の2つの仕事(メソッド)が定義されています。 repaint() はどんな仕事をするか定義されていないので,親クラスであるApplet クラスの仕事であると判断できました。  xSmpGUI03.java をコンパイルすると  xSmpGUI03.class の他に,xSmpGUI03$xButtonAdapter.class ができます。これ は,xSmpGUI03 クラスの内部クラスである xButtonAdapter クラスが出来たこと を表わしています。内部クラスは,$でつないで示しています。 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃  内部クラスは,コンパイルすると,クラス名の中に$マークが入る。   ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ------------------------------------------------------------------------ ▼ 今回のポイント  枠付きで書いたものを見てみましょう。  ・アプレットは,ウェブページに矩形で表示されて,そこで実行される。  ・アプレットは,Applet クラスを継承している。  ・アプレットの最大の仕事は,paint() である。  ・init() は,paint() の準備をする。  ・repaint() は,親経由で,paint() を実行する。  ・タグは,paint() で表示されるエリアを確保する。  ・アプレットは,Applet クラスの手のひらの上で動く。  ・アプレットの親友は,Graphics クラスである。  ここまでがアプレットの特色でした。  以下は,アプレットに限らずに,Java のプログラムの特色です。  ・import を見れば,登場する友達(クラス)が分かる。  ・仕事(メソッド)の前に,ピリオドがあれば,実行する友達が分かる。  ・だれが実行するのが不明な仕事(メソッド)は,そこのクラスか実行する。  ・クラスに仕事の内容が書いてない仕事は,そのクラスが書いてある外枠のクラ   スが実行する。  ・クラスに仕事の内容が書いてない仕事は,そのクラスが書いてある外枠のクラ   スが実行する。外枠が無いときは,親が実行する。  ・Java では,プログラムはクラスである。  ・クラスの拡張子は,class である。  ・内部クラスは,コンパイルすると,クラス名の中に$マークが入る。 ------------------------------------------------------------------------ ▼ 次号の予定  この号で扱うと予告してあったレイアウト,パネル,キャンパスは,いよいよ 次号で扱います。  感想は,斎藤まで,suehiro@he.mirai.ne.jp  広告等のお問い合わせ:jmaga@yscon.co.jp ------------------------------------------------------------------------ ▼ 誤字・脱字等の修正,プログラムの修正など,以下の場所で確認できます。 過去の修正版等  http://3721p.com/java/jmaga/ 登録・削除および広告の案内  http://www2.odn.ne.jp/~egu33/jmaga/java-maga.html ------------------------------------------------------------------------ ▼ 著作権について  このメールマガジンで公開しているプログラムソースは,著作権を当方スタッ フが所有しますが,商用を含めて,再利用,改変,発表を制限しません。  本文に関しては,斎藤末広が著作権を所有します。再利用に関しては,承諾を 必要とします。 広告募集 http://www2.odn.ne.jp/~egu33/jmaga/java-maga.html ------------------------------------------------------------------------ ▼アンケート(以下を返信してください)  この号のJマガに対するご意見をお待ちしてます。ぜひ,ご返信下さい。 内容のレベルは 1 難しいのでもっと簡単にしてほしい 2 ちょうどよい 3 もっと難しくてもよい その他ご要望