Applet アプレット ◇長い長いアプレット講座◇
◇ 準備 フォルダ名 Applet ソースのコピー元 ~wanko/Java/Applet2/* . シンボリックリンク作成 フォルダ名 Applet ソースのコピー元 ~wanko/Java/Applet2/* . シンボリックリンク作成 cd ~/public_html ln –s ~/Java .
◇ シンボリックリンク あるファイルに対してその本来のフルパスに加えて、別のパスからによるアクセスも可能にする どちらか一方が修正されるともう一方も修正される windowsのショートカットと似たような役割
1,Appletの実行 アプレットとはwwwブラウザから直接実行できる形式のプログラム (前章までのはアプリケーション) 実行方法は二つ (前章までのはアプリケーション) 実行方法は二つ ブラウザから呼び出す コマンドラインで直接(デバックなどに有効)
◇ Hello.java 画面にHelloと表示させるアプレット 1 import java.awt.Graphics; 2 import java.applet.Applet; 3 4 public class Hello extends Applet{ 5 public void paint(Graphics g){ 6 g.drawString("Hello",100,20); 7 } 8 }
◇ Hello.java解説 4 public class Hello extends Applet Appletクラスを元の部品として新しいHelloクラスに継承する 5 public void paint(Graphics g) 描画するためのGraphicsクラスを引数として受け取りGraphicsオブジェクトのメソッドとして描画 6 g.drawString(文字,x座標,y座標); GraphicsクラスのdrawStringメソッドで文字列を ブラウザへ表示
◇ Appletの注意点 この状態だけでコンパイルしてもエラーが出る なぜ? ブラウザで表示させるためのhtmlが必要 アプリケーションとは違いmain()メソッドは必要ない ブラウザで表示させるためのhtmlが必要
◇ Hello.html Hello.classを呼び出すためのhtml 1 < html> 2 < body> 3 < applet code=Hello.class width=300 height=100> 4 < /applet> 5 < /body> 6 < /html> 起動 http://noisy.cs.dm.u-tokai.ac.jp/~自ID/Java/Applet/Hello.html
◎ 演習1:Hello2.java 下記のような文字が表示されるアプレットHello2.javaを書け
◎ 演習1:解答 1 import java.awt.*; 2 import java.applet.*; 3 public class Hello2 extends Applet{ 4 public void paint(Graphics g){ 5 g.drawString(“Javaの道は", 20, 20); 6 g.drawString(“一日にしてならず", 30, 30); 7 g.drawString(“読み人知らず", 40, 40); 8 } 9 }
◇ サブクラスとスーパークラス プログラムの一部を書き換えたい! 丸ごとコピーするのは大変! 継承:サブクラス、スーパークラス
◇ サブクラスとスーパークラス(続き) 1 class A { 2 void hello(){ 3 System.out.println("Hello"); 4 } 5 void bye(){ 6 System.out.println("Bye"); 7 } 8 } 9 class B extends A { 10 void hello(){ 11 System.out.println(“こんにちわ"); 12 } 13 }
◇ サブクラスとスーパークラス(続き) 9 class B extends A 新しいクラスBはクラスAを継承 hello() bye()はそのまま クラスAのもの。 hello()だけ変更 hello() bye() bye() クラスA スーパークラス クラスB サブクラス
◇ オーバーライド 11行目でhello()について新しく書き換えられている。このプログラムを実行した際、優先されるのはクラスBのhello() メソッドのオーバーライド スーパークラスとサブクラスで同じメソッドが存在した場合、サブクラスのメソッドが優先されること 上書き処理ではないので注意
2,グラフィックス基本メソッド Graphicsクラスにあるいろいろなメソッド drawLine(int x1, int y1, int x2, int y2) 座標 (x1, y1) と座標 (x2, y2) との間に線を引く drawArc (int x, int y, int width, int height, int startAngle, int arcAngle) 円弧または楕円弧の輪郭 を描く drawOval(int x, int y, int width, int height) 楕円の輪郭を描く drawRect(int x, int y, int width, int height) 指定された矩形の輪郭を描く
◇ Draw.java グラフィックステスト 1 public class Draw extends Applet{ 2 public void paint(Graphics g){ 3 g.drawLine(10,10,100,200); 4 g.drawOval(30, 30, 20, 20); 5 g.drawArc(100, 30, 20, 20, 30, 120); 6 g.drawRect(150, 10, 200, 180); 7 } 8 }
◎ 演習2:パックマン到来 下のようなパックマンを書くPac.java を書け どのお絵かきメソッドを使うべきか?
◎ 演習2:解答 1 import java.awt.*; 2 import java.applet.Applet; 3 4 public class Pac extends Applet{ 5 public void paint(Graphics g){ 6 g.setColor(Color.green); 7 g.fillArc(100,100,50,50,30,300); 8 } 9 } 6 setColor() 色を設定する。 7 fillArc() drawArc()の塗りつぶしバージョン
3,データの引渡し アプリケーション argv経由でのデータ入力 アプレット htmlの中で指定 実行中直接キーボードなどのイベントを経由
◇ Hello3.java html文章からデータを受け取り表示する 1 import java.awt.Graphics; 2 import java.applet.Applet; 3 4 public class Hello3 extends Applet{ 5 public void paint(Graphics g){ 6 String a = getParameter("text"); 7 g.drawString("Hello",100,20); 8 g.drawString(a,100,80); 9 } 10 }
◇ Hello3.html Hello3.javaを呼び出すhtml 1 <html> 2 <applet code="Hello3.class" width=20 height=80> 3 <param name="text" value="Chao"> 4 </applet> 5 </html>
◇ Hello3.java解説 Java 6 String a = getParameter("text"); html 指定した名前のデータを文字列型で取り出す html 3 <param name="text" value="Chao"> nameというものがパラメータの名前 valueの中身が返される値
4,MouseEvent マウスクリック MouseEvent MouseListener マウスの動きに関したイベント 下記のイベントを受け取るためのリスナーインタフェース mousePressed マウスボタンが押されると発生 mouseReleased マウスボタンが離されると発生 mouseClicked マウスボタンが押されてから離されると発生 mouseEntered マウスがコンポーネント領域に入ると発生 mouseExited マウスがコンポーネント領域から出ると発生
◇ Pacman.java マウスクリックした位置にパックマンを表示 1 import java.applet.*; 2 import java.awt.*; 3 import java.awt.event.*; 4 5 public class Pacman extends Applet 6 implements MouseListener { 7 int x, y; 8 9 public void init() { 10 x = 50; y = 50; 11 addMouseListener(this); 12 } 13 public void paint(Graphics g) { 14 g.setColor(Color.green); 15 g.fillArc(x - 10, y - 10, 20, 20, 30, 300); 16 } 17 } 18 public void mouseClicked(MouseEvent e) { 19 x = e.getX(); 20 y = e.getY(); 21 repaint(); 22 } 23 public void mouseEntered(MouseEvent e) { 24 } 25 public void mouseReleased(MouseEvent e) { 26 } 27 public void mouseExited(MouseEvent e) { 28 } 29 public void mousePressed(MouseEvent e) { 30 } 31 }
◇ Pacman.java解説 9 public void init() 11 addMouseListener(this) 変数などの部品の初期値を入れて定義 プログラムの前準備 11 addMouseListener(this) addMouseListner メソッドを()内のthisによってPacmanクラスに 設定し、関連するマウスイベントを受け取るように登録されている すべてのMouseListenerオブジェクトまたは MouseAdapter オブジェクトに渡される
◇ Pacman.java(続き) 23~30行目の定義は必要なのか? 結論:必要!ないとエラーが出る インターフェース implement メソッドのないクラスの定義。定数の定義やメソッドの宣言(中身なし)からなっている。MouseEventを扱うために定義しなければならないメソッドをすべて宣言しておけば、実行時にメソッドが不足することをコンパイル時に検出できる。 implement そのクラスで利用するインターフェースを指定することをインターフェースを実装する(implement)という
◎ 実習1:Pacman2.java Pacman.javaを元にして,マウスを押している間はピンク,マウスを離したら赤で移動するPacman2.javaを書け. ヒント mouseClickedは押されてから離されると起動 今回必要なイベントは? 色の塗り替えはsetColor()メソッド 引数はColorオブジェクト・・・例:setColor(Color.green) setColor()メソッドを使うときはg.setColor()で塗る場所指定 (Graphics g)の設定はpaintメソッドで指定されているからそのまま別のメソッドでは使えないが?
◎ 実習1:解答例 1 import java.applet.*; 2 import java.awt.*; 3 import java.awt.event.*; 4 5 public class Pacman2 extends Applet 6 implements MouseListener { 7 int x, y; 8 Color clr; 9 10 public void init() { 11 x = 50; y = 50; 12 addMouseListener(this); 13 } 14 public void paint(Graphics g) { 15 g.setColor(clr); 16 g.fillArc(x - 10, y - 10, 20, 20, 30, 300); 17 } 18 public void mouseClicked(MouseEvent e) { 19 x = e.getX(); 20 y = e.getY(); 21 repaint(); 22 } 23 public void mouseEntered(MouseEvent e) { 24 } 25 public void mouseReleased(MouseEvent e) { 26 clr = Color.red; 27 repaint(); 28 } 29 public void mouseExited(MouseEvent e) { 30 } 31 public void mousePressed(MouseEvent e) { 32 clr = Color.pink; 33 repaint(); 34 } 35 }
5,MouseMotion マウスの動きのイベント MouseMotionListener 下記のイベントを受け取るためのリスナーインタフェース mouseDragged コンポーネント上でマウスボタンが押された後ドラッグされたときに呼び出される mouseMoved コンポーネント上でマウスが移動される(ボタンは押されない)と呼び出される
◇ Draw2.java マウスの動きに合わせて線を引く 1 import java.applet.*; 2 import java.awt.*; 3 import java.awt.event.*; 4 5 public class Draw extends Applet 6 implements MouseMotionListener { 7 int x, y; 8 Color c; 9 Graphics g; 10 11 public void init() { 12 x = 50; y = 50; 13 c = Color.green; 14 addMouseMotionListener(this); 15 g = getGraphics(); 16 } 17 public void paint(Graphics g) { 18 } 19 public void mouseDragged(MouseEvent e){ 20 } 21 public void mouseMoved(MouseEvent e){ 22 int x2 = e.getX(); 23 int y2 = e.getY(); 24 g.drawLine(x, y, x2, y2); 25 x = x2; 26 y = y2; 27 } 28 }
◇ Draw2.java解説 14 addMouseMotionListener(this); 15 g = getGraphics(); Pacman.javaのときと同様にthisによって自分のいるDrawクラスに設定し、MouseMotionというイベントをキャッチする 15 g = getGraphics(); コンポーネントのGraphicsコンテキストを作成する 24 g.drawLine(x, y, x2, y2); Graphicsオブジェクトが設定されているのは17~18行目のpaintメソッド。よってmouseMovedイベントでは変数gはそのままでは使用できない インスタンス変数の使用
◇ インスタンス変数 インスタンス変数 ローカル変数 クラスの中で定義されたすべてのメソッドから参照することができる あるクラスのインスタンスが存在し続ける間、情報を保持し続ける変数 ローカル変数 メソッド内で定義してその中でのみ通用する変数 メソッドの実行が終われば消えてしまう
◎ 演習3:一筆書き講座 Draw2.javaを改良して,次のようにマウスの左ボタンを押している間だけ先が引ける Draw3.java を書け.
◎ 演習2:解答 1 import java.applet.*; 2 import java.awt.*; 3 import java.awt.event.*; 4 public class Draw3 extends Applet 5 implements MouseMotionListener { 6 int x, y; 7 Graphics g; 8 9 public void init() { 10 x = 50; y = 50; 11 addMouseMotionListener(this); 12 g = getGraphics(); 13 } 14 public void paint(Graphics g) { 15 } 16 17 public void mouseDragged(MouseEvent e){ 18 int x2 = e.getX(); 19 int y2 = e.getY(); 20 g.drawLine(x, y, x2, y2); 21 x = x2; 22 y = y2; 23 } 24 public void mouseMoved(MouseEvent e){ 25 } 26 }