プログラミング言語 3 第 10 回 (2007 年 12 月 03 日 ) 1 今日の配布物 片面の用紙 1 枚 今日の課題が書かれています 本日の出欠を兼ねています 2/40 1
今日やること http://www.tnlab.ice.uec.ac.jp/~s-okubo/class/java06/ にアクセスすると 教材があります 2007 年 12 月 03 日分と書いてある部分が 本日の教材です 本日の内容 前回の課題の解答 Java アプレット 基本的な画像線画 マウスイベントの検知 3/40 前回の課題の解答 4/40 2
前回の課題その 1:Sample09a.java をコンパイルなさい その後 test.txt というファイルがある場合と無い場合 それぞれの場合に対して実行し 結果を報告しなさい 5/40 test.txt がある場合 import java.io.*; コンソールに END と表示される public class Sample09a{ public static main(string args[]){ try{ try{ FileReader fr fr = new new FileReader("test.txt"); 1 tryの中が実行さ catch(filenotfoundexception e){ e){ れる エラーの発 System.out.println("Error:"+ e); e); 生も監視される return; System.out.println("END"); 2 エラーは発生しな 3 普通に実行される かったので 実行されない 6/40 3
test.txt がない場合 1 tryの中が実行され import java.io.*; る エラーの発生も public class Sample09a{ 監視される 2 test.txtがないので public static main(string args[]){ try{ エラーが発生 try{ FileReader fr fr = new new FileReader("test.txt"); catch(filenotfoundexception e){ e){ System.out.println("Error:"+ e); e); return; 2 エラーが発生したので 対応す る例外処理が実行される System.out.println("END"); 今回はFileNotFoundException なので ここが実行される 3 エラーの原因を出力した後 return によってプログラムの実行が停止する コンソールに Error:java.io.FileNotFoundException: test.txt (No such file or directory) と表示される 7/40 前回の課題その 2:Sample09b.java をコンパイルなさい エラーが発生するので そのエラーを報告しなさい 8/40 4
Sample09b.java import java.io.*; FileReader は catch 例外を起こす可能性があるのに 例外処理が書かれていない! public class Sample09b{ public static main(string args[]){ FileReader fr fr = new new FileReader("test.txt"); コンソールに Sample09b.java:7: 例外 java.io.filenotfoundexception は報告されません スローするにはキャッチまたは スロー宣言をしなければなりません FileReader fr = new FileReader("test.txt"); ^ エラー 1 個 と表示される catch 例外を起こす可能性がある命令は 例外処理を書く必要がある 9/40 前回の課題 その 3: Sample09c.java と Sample09d.java について 次に答えなさい それぞれを test.txt が有る場合と無い場合で実行し 結果を答えなさい 上記のことが どのような流れで処理された結果 起きているのか 説明しなさい 10/40 5
Sample09c.java で test.txt がある場合 コンソールに FINALLY END と表示される import java.io.*; 1 public class Sample09c{ public static main(string args[]){ try{ try{ FileReader fr fr = new new FileReader("test.txt"); 2 catch(filenotfoundexception e){ e){ System.out.println("Error:"+ e); e); 3 finally{ System.out.println("FINALLY"); System.out.println("END"); 4 実行される test.txt があるので エラーは発生しない エラーがないので実行されない finally はエラーの有無にかかわらず 必ず実行される 11/40 Sample09c.java で test.txt がない場合 コンソールに Error:java.io.( 略 ) FINALLY END と表示される import java.io.*; 1 public class Sample09c{ public static main(string args[]){ try{ try{ FileReader fr fr = new new FileReader("test.txt"); 2 catch(filenotfoundexception e){ e){ System.out.println("Error:"+ e); e); 3 finally{ System.out.println("FINALLY"); System.out.println("END"); 4 実行される test.txt がないので エラーが発生 エラーがあったので実行される! finally はエラーの有無にかかわらず 必ず実行される 12/40 6
Sample09d.java で test.txt がある場合 コンソールに FINALLY END と表示される import java.io.*; 1 public class Sample09d{ public static main(string args[]){ try{ try{ FileReader fr fr = new new FileReader("test.txt"); catch(filenotfoundexception e){ 2 e){ System.out.println("Error:"+ e); e); return ; 3 finally{ System.out.println("FINALLY"); System.out.println("END"); 4 実行される test.txt があるので エラーは発生しない エラーがないので実行されない finally はエラーの有無にかかわらず 必ず実行される 13/40 Sample09d.java で test.txt がない場合 コンソールに Error:java.io.( 略 ) FINALLY と表示される import java.io.*; 1 test.txtがないので public class Sample09d{ エラーが発生 public static main(string args[]){ try{ try{ FileReader fr fr = new new FileReader("test.txt"); 2 エラーがあった catch(filenotfoundexception e){ e){ ので実行される! System.out.println("Error:"+ e); e); return ; returnが実行される前に finally{ System.out.println("FINALLY"); 3 finallyは エラーの有無に System.out.println("END"); かかわらず returnが実行されて終了必ず実行される 14/40 7
前回の課題 その 4: Sample09h.java について 次に答えなさい 実行結果と そのようになった理由を報告すること 1. そのままコンパイル 実行した場合 2. プログラム中 int int02=5; を int int02=100; にして コンパイル 実行した場合 3. プログラム中 int int02=5; を int int02=0; にして コンパイル 実行した場合 15/40 その 1 public class Sample09h{ public static main(string args[]){ int[] int01 = {1,2,3,4,5,6,7,8,9,10; int int int02=5; 02=5; try{ try{ System.out.println(500/int02); System.out.println(int01[int02]); catch(exception e){ e){ System.out.println("Error:"+ e); e); return; コンソールに 10 6 と表示される 500/5 を実行して 結果を出力 int01[5] を出力 16/40 8
public class Sample09h{ public static main(string args[]){ int[] int01 = {1,2,3,4,5,6,7,8,9,10; int int int02=100; その 2 コンソールに 5 Error:java.lang.ArrayIndexOutOfBoundsException: 100 と表示される try{ try{ System.out.println(500/int02); System.out.println println(int int01[ 01[int int02]); 02]); catch(exception e){ e){ System.out.println("Error:"+ e); e); return; 500/100 を実行して 結果を出力 配列に 100 番目の要素は無いので エラーが発生! エラーが発生したので このぶぶんが実行される 17/40 その 3 コンソールに Error:java.lang.ArithmeticException: / by zero と表示される public class Sample09h{ public static main(string args[]){ int[] int01 = {1,2,3,4,5,6,7,8,9,10; int int int02=0; 02=0; try{ try{ System.out.println println(500/ (500/int int02); 02); System.out.println(int01[int02]); catch(exception e){ e){ System.out.println("Error:"+ e); e); return; 0 での除算を行おうとしたので エラーが発生! 直ちに実行 エラーが発生したので この部分が実行される 例外処理が終わっても もとの処理に戻ることは無いため System.out.println(int01[int02]); は実行されない 18/40 9
その 3 改 このプログラムでは catch の中の return が無くても 結果は一緒になる public class Sample09h{ public static main(string args[]){ int[] int01 = {1,2,3,4,5,6,7,8,9,10; int int int02=0; 02=0; try{ try{ System.out.println println(500/ (500/int int02); 02); System.out.println(int01[int02]); catch(exception e){ e){ System.out.println("Error:"+ e); e); 0 での除算を行おうとしたので エラーが発生! 直ちに実行 エラーが発生したので この部分が実行される 例外処理が終わっても もとの処理に戻ることは無いため System.out.println(int01[int02]); は実行されない 19/40 Java アプレット 20/40 10
Java とアプレット Java のプログラム 単独で動作するプログラム web browser 上で動作するプログラム (applet) applet の作り方 1. applet のための Java プログラムを書く 2. コンパイルする 3. applet を埋め込む html ファイルを書く 4. web browser で html を読み込み applet を実行する 21/40 実行例 (1/4) 1. applet の為の Java プログラムを書く import java.applet.applet; import java.awt.graphics; public class JavaApplet01 extends Applet{ public paint(graphics g){ g){ g.drawstring("hello World",30,40); appletの場合 mainを含むクラスは必要ありません java.applet と java.awt というパッケージを利用しています ファイル名はJavaApplet01.javaです 22/40 11
実行例 (2/4) 2. コンパイルする javac JavaApplet01.java コンソールで 何時も通りにコンパイルします JavaApplet01.class ができます 23/40 実行例 (3/4) 3. applet を埋め込む html ファイルを書く <applet code="javaapplet01.class" width=250 height= 250> 250> </applet> code で class ファイル名を指定 width と height で browser 上に表示するときのサイズを指定 テキストエディタで書いて下さい 拡張子は html もしくは htm としましょう 拡張子以外は自由につけてくだい 今回の例では Sample10.htmとしました 24/40 12
実行例 (4/4) 4. web browser で html を読み込み applet を実行する 普通に Sample10.htm を web browser で開きます 場合によっては セキュリティーが云々と言うかも知れませんが 適時 処置して下さい 今回の例では 座標 (30,40) あたりに Hello World という文字列が表示されます 25/40 appletviewer の利用 web browser で html を開かなくても appletviewer を使うことでも applet を動かすことができます コンソールで appletviewer Sample10.htm とうつと 新しいwindowが立ち上がり appletが実行されます 26/40 13
appletviewer の利用その 2 appletviewer の場合 htmlファイルがなくても javaのソースコードにタグを書くことで実行できる import import java.applet.applet; java.applet.applet; import import java.awt.graphics; java.awt.graphics; /* /* <applet <applet code="javaapplet code="javaapplet JavaApplet01.class" JavaApplet01.class" width=250 width=250 height=250> height=250> </applet> </applet> */ */ public public class class JavaApplet01 JavaApplet01 extends extends Applet{ Applet{ public public paint(graphics paint(graphics g){ g){ g.drawstring("hello g.drawstring("hello World",30,40); World",30,40); コメントアウト内に <applet> のタグを書く ここではソースを指定します コンソールで あらかじめコンパイルしておくこと appletviewer JavaApplet01.java 27/40 applet の書き方 java.applet と java.awt というパッケージを利用します Applet というクラスを拡張したクラスを作成することになります main というクラスは必要ありません その代わり ある特定のメソッドを書くと ある順番通りに実行されていきます 必要なメソッドだけを記述します 28/40 14
標準メソッド init() メソッド 初期化が必要な時に書く 最初に 1 回だけ実行される start() メソッド init() メソッドの次に実行される また 実行が再開されたときにも実行される stop() メソッド アプレットの実行が中断したとき実行される paint() メソッド 画面線画等の具体的な記述を行う repaint() メソッド 再線画を行うときに試用する upate() メソッド repaint() が実行されたときに実行される destroy() メソッド アプレットが終了するときに実行される 29/40 標準メソッド 起動 意図的な再線画 init() repaint() start() paint() update() 中断 再開 stop() destroy() 終了 30/40 15
基本的な画面線画 31/40 Graphics クラス public paint(graphics g) の Graphics は Graphics クラスを意味しています 画面の描画を行いたい場合 Graphics クラスのオブジェクトのメソッドを実行します この例の場合 オブジェクト g のメソッドを実行することで 画面線画等を行います 32/40 16
例 import java.applet.applet; import java.awt.graphics; import java.awt.color; /* /* */ */ <APPLET CODE="JavaApplet02.class" WIDTH=250 HEIGHT= 100> 100> </APPLET> public class JavaApplet02 extends Applet{ public paint(graphics g){ g g){ g.drawstring("hello World",30,40); g.drawline(0,0,100,100); g.setcolor(color.blue); g.fillrect(45,20,20,20); g.clearrect(30,30,20,20); g.drawroundrect(60,60,20,20,5,5); Graphics クラスのインスタンス g g のメソッドとして描画を実行 33/40 戻り値 Graphics クラスの主なメソッドその 1 記法と意味 drawline(int x1, int y1, int x2, int y2); 座標 (x1,y1) から (x2,y2) まで線を引く drawrect(int x, int y, int width, int height) 座標 (x,y) を左上の座標とした サイズ width x height の四角を書く fillrect(int x, int y, int width, int height) 座標 (x,y) を左上の座標とした サイズ width x height の 塗りつぶされた四角を書く 34/40 17
Graphics クラスの主なメソッドその 2 戻り値 記法と意味 drawroundrect(int x, int y, int width, int height, int arcwidth, int archeight) 座標 (x,y) を左上の座標とした サイズ width x height の角丸の四角を書く 丸さを arcwidth と archeight で指定 fillroundrect(int x, int y, int width, int height, int arcwidth, int archeight) 座標 (x,y) を左上の座標とした サイズ width x height の 塗りつぶされた角丸の四角を書く 丸さを arcwidth と archeight で指定 35/40 Graphics クラスの主なメソッドその 3 戻り値 記法と意味 clearrect(int x, int y, int width, int height) 座標 (x,y) を左上の座標とした サイズ width x height の領域を消す drawstring(attributedcharacteriterator iterator, int x, int y) 座標 (x,y) に iterator の文字列を出力する iterator の部分には 文字列を記述することが多い copyarea(int x, int y, int width, int height, int dx, int dy) 座標 (x,y) を左上の座標とした サイズ width x height の領域を 座標 (dx,dy) にコピーする 36/40 18
戻り値 Graphics クラスの主なメソッドその 4 記法と意味 drawoval(int x, int y, int width, int height) 座標 (x,y) を外接四角形の左上座標とした サイズ width x height のサイズの楕円を書く filloval(int x, int y, int width, int height) 座標 (x,y) を外接四角形の左上座標とした サイズ width x height のサイズの塗りつぶされた楕円を書く 37/40 戻り値 Graphics クラスの主なメソッドその 5 記法と意味 drawarc(int x, int y, int width, int height, int startangle, int arcangle) 座標 (x,y) を外接四角形の左上座標とした サイズ width x height のサイズの円弧を書く 円弧の始点の角度を startangle で 描く円弧の角度を arcangle で指定する drawarc(int x, int y, int width, int height, int startangle, int arcangle) 座標 (x,y) を外接四角形の左上座標とした サイズ width x height のサイズの塗りつぶされた扇形を書く 扇の始点の角度を startangle で 描く扇の角度を arcangle で指定する 38/40 19
Graphics クラスの主なメソッドその 6 戻り値 記法と意味 setcolor(color c) 描画する色を c に変更する ここで Color は java.awt. に含まれているクラス c として Color.blue, Color.white, Color.lightGray, Color.gray, Color.darkGray, Color.black, Color.red, Color.pink, Color.orange, Color.cyan, Color.yellow, Color.green, Color.magenta が指定できる 39/40 Graphics クラスの主なメソッドその 7 戻り値 記法と意味 drawpolygon(int[] xpoints, int[] ypoints, int npoints) npoints 個の座標を結んだ多角形を書きます xpoints には x 座標を ypoints には y 座標を格納しておきます fillpolygon(int[] xpoints, int[] ypoints, int npoints) npoints 個の座標を結んだ多角形を書き 内部を塗りつぶします xpoints には x 座標を ypoints には y 座標を格納しておきます 40/40 20
Graphics クラスの主なメソッド 他にも さまざまなメソッドが準備されています 詳細は サン マイクロシステムズのサイト http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/awt/graphics.html を参照 41/40 マウスイベントの検知 42/40 21
マウスイベントとは Javaにおいてマウスを扱う方法は 複数有ります ここでは インターフェース MouseListenerを実装する方法を紹介します java.awtとjava.awt.eventというパッケージに属するクラスを利用します Javaでは 次のような感じでマウスを扱います 1. ( ユーザーがマウスを使って何かする ) 2. マウスイベントが発生したと Javaが認識! 3. マウスイベントに応じて 何らかの処理を行う 43/40 マウス処理を行うために 次のことを行う必要があります マウスイベントが発生したことを認識するようにする ソースに addmounselistener(this); と記述する 発生したマウスイベントに応じて 何を行うかを記述する MouseListener を implements する 次の 5 つのメソッドをオーバーライドする 必ずオーバーライドする必要がある 44/40 22
インターフェース MounseListener のアブストラクトメソッド 記法 public mouseenterd(mouseevent me) public mouseexited(mouseevent me) public mousepressed(mouseevent me) public mousereleased(mouseevent me) public mouseclicked(mouseevent me) 意味 マウスが窓の領域に入ったときに実行 マウスが窓の領域から出たときに実行 マウスボタンが押されたときに実行 マウスボタンが離されたときに実行 マウスボタンがクリックときに実行 45/40 クラス MouseEvent マウスに関して起きるイベント関係のクラスです ここでは 詳細は行いません 以下の 2 つのメソッドのみを紹介します 戻り値 int int 記法と意味 getx() イベントが発生したときの X 座標を返します gety() イベントが発生したときの X 座標を返します 46/40 23
サンプルプログラム [1/3] import java.applet.applet; import java.awt awt.*;.*; import java.awt awt.event.*; /* /* */ */ 必要なパッケージを import <applet code="javaapplet03.class" width=250 height= 250> 250> </applet> public class JavaApplet03 extends Applet implements MouseListener{ int int x=10,y=10; public init(){ MounseListenerを addmouselistener(this); 実装する public paint(graphics g){ マウス関係のイベン g){ g.drawstring("hello World",x,y); トを検知するように 47/40 サンプルプログラム [2/3] public mouseenterd(mouseevent me){ me){ 必ず 5 つのメソッドをオーバーライド public mouseexited(mouseevent me){ me){ public mousepressed(mouseevent me){ me){ x=me.getx; y=me.gety; repaint(); repaint() を実行すると paintも実行される! マウスがクリックされたら 1. イベントの起きた x 座標を x に保存 2. イベントの起きた x 座標を y に保存 3. repaint() を実行 48/40 24
サンプルプログラム [3/3] public mousereleased(mouseevent me){ me){ public mouseclicked(mouseevent me){ me){ 49/40 25