第 14 回 第 12 章アプレット 28 8 アプレットとは アプレット : ウェブ上で HTML のソースコードから参照されるプログラム.Web サーバや Web ブラウザ ( アプレットビューア ) から動的にアプレットはダウンロードされる. 289
HelloAp.java アプレットの基本事項 public class HelloAp extends Applet{ public void paint(graphics g){ //paint メソッドは画面描画に関する Graphics クラスのオブジェクトを受ける g.drawstring( HelloApplet,30,60); // 座標 (30, 60) に HelloApplet と表示 Java アプレットは,HTML ファイルから呼び出す. HelloAp.html (HTML ファイルの名前は,Java アプレットのファイル名と同じである必要はない ) <HTML> <HEAD><TITLE>Applet Test</TITLE></HEAD> <BODY> <P><APPLET CODE="HelloAp.class" WIDTH=500 HEIGHT=500 ALIGN=bottom> </APPLET></P> </BODY> </HTML> コンパイルと実行 K: java 14th>javac HelloAp.java K: java 14th>appletviewer HelloAp.html *.java ファイルをコンパイルしてできる *.class ファイルを使用 本来は InternetExplorer などの Web ブラウザで表示させたいのだが, 最近はセキュリティーが強化され, アプレットプログラムに証明書が必要らしい. よって本講義ではアプレットの動作チェックに appletviewer を用いる. 290 HelloAp の実行結果 291
定義されている色 292 グラフィック, アプレットの主なメソッド Java プログラムは,main メソッドから処理が開始される. それに対し,Java アプレットは Web ブラウザ等から呼び出されるため,main メソッドは必要ない. Web ブラウザ等が main メソッドの役割を果たす. 293
アプレットの動作 Web ブラウザ等でアプレットを呼び出すと,init() メソッドが実行されてアプレットを初期化 アプレット起動時に start() メソッドが実行され, アプレットがアクティブになる ( 処理を実行 ). stop() メソッドはアプレットが破棄される直前に呼び出されアプレットを停止する. アプレットが完全に終了する際に destroy() メソッドが実行される. 294 Dmojic.java 文字のカラー表示 public class Dmojic extends Applet{ public void paint(graphics g){ // 色を red( 赤 ) に設定. g.setcolor(color.red); g.drawstring(" 赤赤赤 (50, 50)",50,50); Dmojic.html (HTML ファイルの名前は,Java アプレットのファイル名と同じである必要はない ) <HTML> <HEAD><TITLE>Dmojic-test</TITLE></HEAD> <BODY> <P><APPLET CODE="Dmojic.class" WIDTH=500 HEIGHT=500 ALIGN=bottom> </APPLET></P> </BODY> </HTML> コンパイルと実行 K: java 14th>javac Dmojic.java K: java 14th>appletviewer Dmojic.html *.java ファイルをコンパイルしてできる *.class ファイルを使用 295
Dmojic の実行結果 296 Dline2.java // 例題 3 長方形 (10, 30) (100, 200) public class Dline2 extends Applet{ public void paint(graphics g){ g.setcolor(color.blue); g.drawstring(" 青 ",55,30); g.drawline(10,30,100,30); g.setcolor(color.red); g.drawstring(" 赤 ",100,115); g.drawline(100,30,100,200); g.setcolor(color.green); g.drawstring(" 緑 ",55,200); g.drawline(100,200,10,200); g.setcolor(color.darkgray); g.drawstring(" 灰 ",10,115); g.drawline(10,200,10,30); 線分のカラー表示 実行結果 297
Imageg.java // 例題 4 gif データの表示 例題 4 画像データの表示 実行結果 public class Imageg extends Applet{ Image img; public void init(){ img=getimage(getdocumentbase(),"cover.gif"); public void paint(graphics g){ g.drawimage(img,10,10,this); 画像を扱うクラス Image のオブジェクト img 生成 画像データは,getImage メソッドでファイルから読み込む.1 つ目の引数の getdocumentbase メソッドは画像が存在するディレクトリを示し, 2 つ目の引数として画像ファイル名を指定. 画像の表示は drawimage メソッドで行う.img は Image クラスで指定したものであり, 座標 (10, 10) の場所に, 指定した cover.gif の画像を this により指定して表示. 298 Button1.java // 例題 5 add(bt) の this はなし // ボタンが正しく動作するプログラム import java.awt.event.*; 例題 5 ボタンの表示とヒット処理 public class Button1 extends Applet implements ActionListener{ Button bt; public void init(){ // ボタンの作成と位置の決定. bt=new Button(" 開始 "); add(bt); bt.addactionlistener(this); public void actionperformed(actionevent ae){ bt.setlabel(" 中止 "); イベント ( ボタンがクリックされる ) の処理を可能とするため,java.awt.event.* を呼び出す. イベント処理のためのインタフェース ActionListener を実装 ボタンを扱うクラス Button のオブジェクト bt を生成 ( 生成直後のラベルは 開始 とする ) add(bt): オブジェクト bt をアプレットのコンポーネントとして登録 bt オブジェクトを bt.addactionlistener(this); でイベントが発生するかを調べる対象として登録 イベントが発生 ( ボタンがクリックされる ) すると actionperformed メソッドが呼び出される. actionperformed メソッドは,bt.setLabel( 中止 ); でボタンのラベルを 中止 に変更. 299
例題 5 ボタンの表示とヒット処理 : 実行結果 ボタンクリック 300 例題 6 アプレットによるアニメーションの表示 HelloAp1.java ( 冒頭,init メソッド部分 ) /* <APPLET CODE="AnimationTest" WIDTH=200 HEIGHT=150> </APPLET> */ public class HelloAp1 extends Applet implements Runnable{ // 位置, 描画間隔 int positionx=0, positiony=0, waiting=100; // Thread として athread を定義 Thread athread; // Image 用バッファとして buffer を定義 ( 画像要素を逐次描画するのではなく,buffer に全て画像要素を書き込んで // から一気に描画する 描画途中が見えないように ) Image buffer; // Graphics 用バッファとして graphicsbuffer を定義 Graphics graphicsbuffer; // 初期設定 public void init(){ athread=new Thread(this); // athread 自身をスレッドに設定 athread.start(); Dimension d=getsize(); // Image 用バッファを, ダブルバッファリング処理用 createimage メソッドでセット // buffer のサイズはを表示領域のサイズと同じにするため,getSize メソッドで得たサイズを使用 buffer=createimage(d.width,d.height); 301
例題 6 アプレットによるアニメーションの表示 HelloAp1.java (run メソッド,update メソッド部分 ) // 実行 & 再表示処理 public void run(){ try{ while(true){ // 無限ループ. 例外が発生するまで続く // repaintメソッドで再表示 repaint(); Thread.sleep(waiting); // waiting=100のため,100 msごとに再表示を行う. catch(exception e){ // エラー処理 e.printstacktrace(); // 更新処理 public void update(graphics g){ paint(g); 302 例題 6 アプレットによるアニメーションの表示 HelloAp1.java (paint メソッド部分 ) // paint 処理 public void paint(graphics g){ // graphicsbufferには何が入っているか if(graphicsbuffer==null){ GraphicsBuffer=buffer.getGraphics(); // もう一度, 描画領域の大きさを得る Dimension d=getsize(); // 色を設定 graphicsbuffer.setcolor(color.white); // 塗りつぶしの設定 graphicsbuffer.fillrect(0,0,d.width,d.height); // 色の設定 graphicsbuffer.setcolor(color.red); // 文字の設定 graphicsbuffer.drawstring ("HelloAp1",d.width-positionX,positionY); // 文字を描く g.drawimage(buffer,0,0,this); // bufferに貯めたデータを一気に描画 // x 位置をずらす-%- 剰余 positionx=(positionx+2)%d.width; // y 位置をずらす-%- 剰余 positiony=(positiony+2)%d.height; HelloAp1.html の例 <HTML> <HEAD><TITLE>HelloAp1-test</TITLE></HEAD> <BODY BGCOLOR="7F7F7F"> <P><APPLET CODE="HelloAp1.class" WIDTH=200 HEIGHT=150 ALIGN=bottom> </APPLET></P> </BODY> </HTML> 描画領域サイズの矩形を, 白い色で塗りつぶす ( 背景を作成 ) buffer に格納 赤色の文字で HelloAp1 と表示 buffer に格納 303
例題 6 アプレットによるアニメーションの表示 : 実行結果 304