Transcript Document

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