1.Java 概要 2.簡単なアプレット 3.動画を表示するアプレット 4.アプレットの改良 5.開発環境の利用(データベース) 情報処理学会九州支部講習会 「インターネット最前線」 Java プログラミング-入門編- 九州工業大学情報科学センター 山之上 卓 1999 年 2 月 9 日 1.Java 概要 2.簡単なアプレット 3.動画を表示するアプレット 4.アプレットの改良 5.開発環境の利用(データベース)
1.Java 概要 1-1 特徴 1-2 Java 開発キット JDK 1-3 アプレットとアプリケーション 1-4 オブジェクト指向とイベント駆動
1-1 特徴 ネットワーク オブジェクト指向 どこでも動く(?), Java VM(仮想マシン) シンプル(>C++), 現実的(>SmallTalk) Thread … concurrent programming可 GC セキュリティー
1-2 Java 開発キット JDK SUN (Java の開発元) が無料で提供, Web や雑誌などで手に入る. javac … Java コンパイラ java … アプリケーション実行 appletviewer … アップレット実行 jar … Java アーカイブ(jar)操作 その他
1-3 アプレットとアプリケーション アプレットは WWW ブラウザの上で動くプログラム. アプリケーションは通常のプログラム. セキュリティのため、様々な制限あり アプリケーションは通常のプログラム. アプリケーションでネットワークプログラミング も可能 ex. HotJava. アプリケーションのコンパイルと実行 アプレットのコンパイルと実行
アプリケーションのコンパイルと実行 プログラム例, コンパイル, 実行 % cat Hello.java public class Hello { static public void main(String argv[]){ System.out.println("hello world."); } % javac Hello.java Hello.class ができる. % java Hello hello world. %
アプレットのコンパイルと実行 プログラム例 Hello1.java: import java.awt.*; import java.applet.*; public class Hello1 extends java.applet.Applet{ public void paint(Graphics g){ g.drawString("HelloWorld",10,20); }
html 例 applet.html: <applet code="Hello1.class" width=100 height=50> </applet> アプレット描画画面の幅 アプレット描画画面の高さ
コンパイル ローカルマシンでの実行 % javac Hello1.java Hello1.class ができる. Hello1.class と applet.html を同じディレクトリに置く ローカルマシンでの実行 % appletviewer applet.html または普通の html ファイルとして閲覧する ことによって実行. Windows などでは、applet.html のアイコンを開く (ダブルクリックなど)
- ftp 等で *.class と *.html をサーバに転送 WWW サーバに載せる場合 - ftp 等で *.class と *.html をサーバに転送 - この html をブラウザで見れば実行開始 - *.class をブラウザが受信して、ローカル(クライアント)マシンで実行される http server applet.html Hello1.java
1-4 オブジェクト指向とイベント駆動 「オブジェクト」と「メッセージパッシング」 マルチプロセスOSと類似 Java プログラムは「クラス」の定義の列 1つのクラスの中身は、1つの C プログラムに類似 … 「メソッド」~関数 クラスはオブジェクトの鋳型 … new で生成 「イベント」駆動 OS がプログラムを呼び出す
2.簡単なアプレット 2-1 ボールを表示 2-2 マウスをクリックした場所にボールを移動 2-3 ボール処理部分を分離
2-1ボールを表示 プログラム 1. import java.awt.*; import java.applet.*; public class BallApplet1 extends java.applet.Applet { public void paint(Graphics g) // ブラウザの表示が更新されるとき、 // ブラウザ側から呼び出される. { g.setColor(Color.red); g.fillOval(100,100, // 楕円が入る左上の座標(x,y) 30,30); // 楕円の幅と高さ }
import … 利用する既存のクラスを指定. ボールを表示するプログラム import … 利用する既存のクラスを指定. java.awt.* … awt は Abstract Window ToolKit(ポータブル GUIライブラリ)である. java.awt は awt「パッケージ(クラスやパッケージの集合)」を表す. Graphics クラスを使うために必要. public … 外部からアクセス可 <-> private class クラス名 … このクラスの名前 extends … クラスの「拡張(継承)」, 上位クラスの定義がまるごと使える Applet クラス… applet の道具立て. 様々なデフォルト(メソッド etc.)が準備されている.
ボールを表示するプログラム void… C の場合と同じ. 値を返さない。 paint… 描画を行う「メソッド」. 表示が更新されたときなど、ブラウザ側から、何度も呼び出される Graphics g… オブジェクト g が描画画面 g.setColor … 色の設定, オブジェクト g の setColor メソッドを呼び出す(メッセージパッシング) Color.red … Color クラスの赤 (定数) g.fillOval … 塗りつぶし楕円を描く,
2-2.マウスをクリックした場所にボールを移動 プログラム2. import java.awt.*; import java.applet.*; public class BallApplet2 extends java.applet.Applet { int px,py; public void init() // 初期化のとき呼ばれる. { px=100; py=100; } public boolean mouseDown(Event e,int x, int y) // マウスがクリックされたとき呼ばれる { px=x; py=y; repaint(); return true;} public void paint(Graphics g) { g.setColor(Color.red); g.fillOval( px,py, 30,30); }
マウスをクリックした場所にボールを移動 int px,py; … ボールの位置 init … 初期化のとき(最初の1回)ブラウザ側から呼ばれる. この他 start, stop 等も使える. boolean … ブール型, true, false mouseDown … マウスがクリックされたとき、ブラウザ側から呼ばれる. true を返すと、この後,なにもしない. repaint … 画面を clear した後, paint を呼び出す.
2-3.ボール処理部分を分離 import java.awt.*; import java.applet.*; プログラム 3. (1/2) import java.awt.*; import java.applet.*; public class BallApplet3 extends java.applet.Applet { ABall ball; public void init() // 初期化のとき呼ばれる { ball=new ABall(100,100,Color.red); } public boolean mouseDown(Event e,int x, int y) // マウスがクリックされたとき呼ばれる { ball.mouseDown(x,y); this.repaint(); return true; } public void paint(Graphics g) { ball.paint(g); } }
プログラム3(2/2) class ABall{ int px,py; Color color; public ABall(int x, int y, Color c) // “constructor” { px=x; py=y; color=c;} // public void mouseDown(int x, int y) { px=x; py=y; } // マウスがクリックされたとき、場所を変える public void paint(Graphics g) { g.setColor(color); g.fillOval( px,py, 30,30); // 塗りつぶした楕円を描く }
ボール処理部分を分離 Ball ball … Ball型(クラス)の オブジェクトを格納する変数 ball を宣言. 別のクラスを利用-「コンポジション」 ball=new Ball(…) … 「コンストラクタ」 Ball(…)によって新たにオブジェクトを作り ball に代入. ball.○○ … ball オブジェクトの○○メソッドまたは変数 this.repaint() … this はこの(アプレット)オブジェクトを示す. int は new していないことに注意 public Ball(…) … コンストラクタ. オブジェクトを生成するときに使用, void 等の型がないことに注意.
3.動画の表示 - ボールを動かす 3-1 設計方針 3-2 ABall クラス 3-3 動かないアプレット 3-4 動くアプレット … Thread の利用
3-1. 設計方針
ABall クラス (1/2) class ABall{ double px,py; //ボールの場所 double dx,dy; //一定時間後の移動. 進行方向 double velocity; //速度(の係数) double xmin,xmax; // x 方向の移動範囲 double ymin,ymax; // y 方向の移動範囲 Random rm; // rm は乱数発生装置 Color color; public ABall(int x, int y, Color c) {init(x,y,c);} public void init(int x, int y, Color c) { px=x; py=y; color=c; xmin=10.0; xmax=300.0; ymin=10.0; ymax=300.0; velocity=10.0;rm = new Random(); dx=rm.nextDouble()*2-1.0; dy=rm.nextDouble()*2-1.0; }
ABall クラス (2/2) public void advance(){ px+=(dx*velocity); py+=(dy*velocity); if(px < xmin){dx=rm.nextDouble(); dy=rm.nextDouble()*2-1.0;} if(xmax < px){dx=-rm.nextDouble(); dy=rm.nextDouble()*2-1.0;} if(py < ymin){dy=rm.nextDouble(); dx=rm.nextDouble()*2-1.0;} if(ymax < py){dy=-rm.nextDouble(); dx=rm.nextDouble()*2-1.0;} } public void paint(Graphics g) { Color cc=g.getColor(); g.setColor(color); g.fillOval((int)px,(int)py,30,30); g.setColor(cc);
ABall クラス Random… 乱数発生クラス. java.util.* パッケー ジを import する必要あり. rm.nextDowble() … 次の, 0 から 1 までの double 値の乱数を返す. g.getColor() … 現在の描画色を返す. g.setColor(Color) … 描画色を Color にする. advance() … 次のボールの位置の計算. 壁 に当たったら, random な方向に反射さ せる.
3-2. 動かないアプレット プログラム4. public class MoveBall1 extends java.applet.Applet { ABall b1; boolean eol; // もし真なら、ループの実行を終了 public void init() { b1=new ABall( 50,50,Color.red); eol=false;} public void start() { run();} public void run(){ System.out.println("run start"); while(!eol){ System.out.println("while loop"); advance(); repaint(); try{ Thread.sleep(20);} catch(InterruptedException e){} }} public void stop() { eol=true; } // 停止のとき実行 public void advance() { b1.advance(); } public void paint(Graphics g) { b1.paint(g); } }
動かないアプレット start() … 初期化後, アプレット開始のためブラウザ側から呼び出される. ここでは run を実行する. run() … while ループ内で, ボールの移動と描画を繰り返す. ところが, ブラウザには何も表示されない. stop() … アプレット停止のためブラウザ側から呼び出される. これが呼び出されると, run() を終了させる.
動かないアプレット Thread.sleep(20) … 20 m 秒, 実行を停止する. sleep は, 割り込み例外(エラー)が発生したとき, InterruptedException という型の例外オブジェクトを「投げる」. static メソッド. C の関数のように利用可 try{処理} catch(Exception e){例外処理} … 例外が発生する可能性のある処理を行い, もし例外が発生したら例外処理を行う.
3-3. 動くアプレット… Thread の利用 public class MoveBall2 extends java.applet.Applet implements Runnable{ ABall b1; Thread me; public void init() { b1=new ABall(30,30,Color.red); me=new Thread(this); me.start(); } public void run(){ while(me!=null){ advance(); repaint(); try{ Thread.sleep(20);} catch(InterruptedException e){}} public void stop() { me=null; } public void advance() { b1.advance(); } public void paint(Graphics g) { b1.paint(g); } プログラム5.
implements Runnable … このアプレットを新しい 制御 Thread として動かすために Runnable 「イ 動くアプレット implements Runnable … このアプレットを新しい 制御 Thread として動かすために Runnable 「イ ンターフェース」を付ける. メソッド run を定義し なければならない. Thread me … Thread クラスの変数 me の宣言, me=new Thread(this) … me にこのアプレット (this)の Thread を代入する. me.start() … me を新しい制御 Thread として開始. start() は run() を呼ぶ. Applet の start とは別.
4.アプレットの改良 4-1 複数のボールを動かす(1) 4-2 複数のボールを動かす(2) 4-2 複数の形を動かす … extend, 継承 4-4 マウスのクリックでボールを起動、停止させる プログラム 9 4-3 オーバーライディングによるメソッドの修正 プログラム 10. 4-4 ダブルバッファリングによるちらつき解消 プログラム 11.
複数のボールを動かす
4-1 複数のボールを動かす(1) プログラム 6. public class Balls1 extends java.applet.Applet implements Runnable{ ABall b1,b2,b3; Thread me; public void init() { me=new Thread(this); b1=new ABall(30,30,Color.red); b2=new ABall(80,200,Color.blue); b3=new ABall(100,100,Color.yellow); me.start(); } public void run(){ while(true){ advance(); repaint(); try{ me.sleep(20);} catch(InterruptedException e){} } 個別に扱うのは大変 ABall クラスから 3つのオブジェクトを 生成
複数のボールを動かす (1)(2/2) public void stop() { me=null; } public void advance() { b1.advance(); b2.advance(); b3.advance();} public void paint(Graphics g) { b1.paint(g); b2.paint(g); b3.paint(g); } } 個別に扱うのは大変
4-2 複数のボールを動かす(2) プログラム 7. public class Balls2 extends java.applet.Applet implements Runnable{ Vector balls; Thread me; int nballs; public void init() { me=new Thread(this); balls=new Vector(); balls.addElement(new ABall(30,30,Color.red)); balls.addElement(new ABall(80,200,Color.blue)); balls.addElement(new ABall(100,100,Color.yellow)); balls.addElement(new ABall(20,100,Color.black)); balls.addElement(new ABall(100,20,Color.green)); balls.addElement(new ABall(40,70,Color.white)); nballs=6; me.start(); } オブジェクトの配列に利用. 複数のオブジェクトをこの配列にまとめる オブジェクトを追加する, 配列の大きさは自動的に変わる
複数のボールを動かす (2) (2/2) public void run(){ while(true){ advance(); repaint(); try{ me.sleep(20);} catch(InterruptedException e){} } public void stop() { me=null; } public void advance() { int i; for(i=0;i < nballs;i++) ((ABall)(balls.elementAt(i))).advance(); } public void paint(Graphics g) ((ABall)(balls.elementAt(i))).paint(g); } i 番目のオブジェクト キャスト
4-3 複数の形を動かす … extend, 継承 プログラム8.
複数の形を動かす …. 形クラス定義の追加部分 class ARect extends ABall{ public ARect(int x, int y, Color c){ init(x,y,c);} public void paint(Graphics g) { Color cc=g.getColor(); g.setColor(color); g.fillRect((int)px,(int)py,30,30); g.setColor(cc); } class Hello extends ABall{ public Hello(int x, int y, Color c){ init(x,y,c);} { Color cc=g.getColor(); g.setColor(color); g.drawString("Hello.",(int)px,(int)py); g.setColor(cc); 矩形の塗りつぶし表示 ABall の継承(copyに類似) 文字列の表示
複数の形を動かす … アプレットの初期化部分 public class Figs extends java.applet.Applet implements Runnable{ Vector figs; int nfigs; Thread me; public void init() { me=new Thread(this); nfigs=5; figs=new Vector(nfigs); figs.addElement(new ABall(30,30,Color.red)); figs.addElement(new ABall(80,200,Color.blue)); figs.addElement(new ABall(100,100,Color.yellow)); figs.addElement(new ARect(150,250,Color.blue)); figs.addElement(new Hello(200,200,Color.green)); me.start(); } …. balls->figs, nballs->nfigs
4-3 オーバーライディングによるメソッドの修正 プログラム 10. 4-4 ダブルバッファリングによるちらつき解消 プログラム 11.
5.市販開発環境の利用 5-1 GUI をドラッグ&ドロップで作成 プログラム 12 5-1 Access をアクセスするアプレットの開発 5-2 絵を DB に保存できるお絵描きアプレット
5-1 GUI をドラッグ&ドロップで作成 TextField, Button, Label を ドラッグ & ドロップ
イベントの関連付け … イベント処理の半自動作成
クラス階層図
イベント処理メソッドの修正
実行
5-2 Access をアクセスするアプレットの開発
ODBC の設定
開発環境における java プログラム自動生成ツール
自動的に作成されたフォーム
実行
5-3 絵を DB に保存できるお絵描きアプレット
参考文献 JAVA 実践プログラミング,O’REILLY JAVA スレッドプログラミング, O’REILLY http://java.sun.com http://www.gamelan.com http://www.tobata.isc.kyutech.ac.jp/~yamanoue/researches/java/