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 }