情報処理学会九州支部講習会 「インターネット最前線」 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 (Java の開発元) が無料で提供, Web や雑誌などで手に入る. javac … Java コンパイラ java … アプリケーション実行 appletviewer … アップレット実行 jar … Java アーカイブ(jar)操作 その他 SUN 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 のアイコンを開く (ダブルクリックなど) WWW サーバに載せる場合 - ftp 等で *.class と *.html をサーバに転送 - この html をブラウザで見れば実行開始 - *.class をブラウザが受信して、ローカル(クライ アント)マシンで実行される http server applet.html Hello1.java 1-4 オブジェクト指向とイベント駆動 「オブジェクト」と「メッセージパッシング」 マルチプロセスOSと類似 プログラムは「クラス」の定義の列 1つのクラスの中身は、1つの C プログラ ムに類似 … 「メソッド」~関数 クラスはオブジェクトの鋳型 … new で生成 「イベント」駆動 Java – 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 … 利用する既存のクラスを指定. 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.ボール処理部分を分離 プログラム 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 プログラム5. 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); } } 動くアプレット 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); ABall クラスから b1=new ABall(30,30,Color.red); 3つのオブジェクトを 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){} } } 複数のボールを動かす (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){} } } i 番目のオブジェクト 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) { int i; for(i=0;i < nballs;i++) ((ABall)(balls.elementAt(i))).paint(g); } } キャスト 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); } ABall の継承(copyに類似) } 矩形の塗りつぶし表示 class Hello extends ABall{ public Hello(int x, int y, Color c){ init(x,y,c);} public void paint(Graphics g) { Color cc=g.getColor(); g.setColor(color); g.drawString("Hello.",(int)px,(int)py); g.setColor(cc); } 文字列の表示 } 複数の形を動かす … アプレットの初期化部分 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 をアクセスするアプレットの開発 接続先になる 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/~yaman oue/researches/java/
© Copyright 2025 ExpyDoc