[目次] [前回] [次回] [重要語索引]

第12週: その他の機能

12. 1 画像
12. 2 音声
12. 3 練習問題
12. 4 乱数
12. 5 練習問題
12. 6 時間
12. 7 練習問題

12.1 画像

アプレットでは、画像ファイルを URL で指定して、キャンバスなどに表示することができます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import java.applet.Applet;  // Applet クラスを使用する
import java.awt.*;          // AWT の基本クラスを使用する

public class ShowImage extends Applet { // Applet を基本とするクラスを宣言

    Image img;  // 画像イメージを記憶するための変数
    Canvas c1 = new Canvas() {  // Canvas のインスタンスを作る
	public void paint(Graphics g) {  // 再描画の時に呼び出されるメソッド
	    g.drawImage(img, 0, 0, this);  // 画像イメージを描く
	}
    };

    public void init() {  // 最初に呼び出されるメソッド
	String s = getParameter("file");  // file パラメータを読み込む
	img = getImage(getDocumentBase(), s);  // パラメータで指定されたファイルのデータを読み込む
	c1.setSize(300, 300);  // キャンバスの大きさを指定する
	add(c1);  // キャンバスを配置する
    }
}

12.2 音声

アプレットでは、音声ファイルの URL を指定して、音を出すことができます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.net.*;

public class Sound extends Applet implements ActionListener {  // ボタンからのイベントを受け取るクラス
    Font f = new Font("Serif", Font.BOLD, 24);  // フォントのインスタンスを作る
    Button bu = new Button("Play!");  // ボタンのインスタンスを作る

    public void init() {  // 最初に呼び出されるメソッド
	bu.setFont(f);  // フォントの指定
	add(bu);  // ボタンを配置
	bu.addActionListener(this);  // ボタンのイベントリスナーを指定
    }

    public void actionPerformed(ActionEvent e) {  // ボタンのイベントが起きた時に呼び出されるメソッド
	play(getDocumentBase(), "computer.au");  // 音を鳴らす
    }
}

12.3 練習問題

自分で画像ファイル音声ファイルを作り、画像をキャンバスに表示し、ボタンを押すと音声が流れるアプレットを作りなさい。

12.4 乱数

乱数は一見でたらめに見える数値の列です。これを使うと実行するたびに処理の内容を変化させることができます。

次のプログラムは、ボタンを押すたびにランダムな位置と半径で円を10個描きます。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

public class RandomCircle extends Applet implements ActionListener {

    int x[] = new int[10];  // X 座標を覚える配列変数
    int y[] = new int[10];  // Y 座標を覚える配列変数
    int r[] = new int[10];  // 半径を覚える配列変数

    Button b1 = new Button("Draw");  // ボタンのインスタンスを作る
    Canvas c1 = new Canvas() {       // キャンバスのインスタンスを作る
	public void paint(Graphics g) {  // 再描画の時に呼び出されるメソッド
	    for (int i = 0; i < 10; i = i + 1) {
		g.drawOval(x[i]-r[i], y[i]-r[i], 2*r[i], 2*r[i]);  // i 番目の円を描く
	    }
	}
    };

    public void init() {  // 最初に呼び出されるメソッド
	c1.setSize(300, 300);  // キャンバスの大きさを設定
	c1.setBackground(Color.white);  // キャンバスの背景色を設定
	setLayout(new BorderLayout());  // BorderLayout を使う
	add(b1, BorderLayout.SOUTH);    // ボタンの配置
	add(c1, BorderLayout.CENTER);   // キャンバスの配置
	b1.addActionListener(this);     // ボタンのイベントリスナーを指定
	setRandom();  // 座標と半径を乱数で決めるメソッドを呼び出す
    }

    public void actionPerformed(ActionEvent e) {  // ボタンのイベントが起きた時に呼び出されるメソッド
	setRandom();  // 座標と半径を乱数で決めるメソッドを呼び出す
	c1.repaint();  // キャンバスを再描画する
    }

    void setRandom() {
	for (int i = 0; i < 10; i = i + 1) {  // 10個分の X 座標、Y 座標、半径を決める
	    x[i] = (int)Math.floor(Math.random()*300);  // 0以上300未満の整数
	    y[i] = (int)Math.floor(Math.random()*300);  // 0以上300未満の整数
	    r[i] = (int)Math.floor(Math.random()*10) + 10;  // 10以上20未満の整数
	}
    }
}

12.5 練習問題

上のプログラムを変更し、いろいろな形の楕円をランダムに描くアプレットにしなさい。

12.6 時間

時刻データを扱うには Date クラスを使います。

次のプログラムは、デジタル時計です。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.applet.Applet;
import java.awt.*;
import java.util.*;

public class DigitalClock extends Applet implements Runnable {

    Font f = new Font("Serif", Font.BOLD, 36);  // フォントのインスタンスを作る
    Date now;  // 時刻を記憶するための変数
    Thread runner;
    volatile boolean running;

    public void start() {
	runner = new Thread(this);
	running = true;
	runner.start();
    }

    public void stop() {
	running = false;
	runner = null;
    }

    public void run() {
	while (running) {
	    setTime();  // 現在時刻をアプレットのウィンドウに表示するメソッドを呼び出す
	    try { Thread.sleep(1000); }  // 1000ミリ秒停止する
	    catch (InterruptedException e) {}
	}
    }

    public void paint(Graphics g) {  // 再描画の時に呼び出されるメソッド
	g.setFont(f);  // フォントの設定
	g.setColor(Color.red);  // 色の設定
	g.drawString(now.toString(), 5, 50);  // 変数 now の時刻を文字列に変換して座標 (5,50) の位置に表示
    }

    void setTime() {
	now = new Date();  // Date クラスのインスタンスを作り、変数 now に代入する
	repaint();  // 再描画する
    }
}

12.7 練習問題

Java プログラムは、インターネットを通して世界のどこで実行されるか分かりませんから、Date クラスはグリニッジ標準時で表示するようになっています。これを日本標準時に変換して表示するようにしましょう。

  1. まず、TimeZone クラスを使って、どの地域の標準時を使うかを設定します。日本標準時は "JST" という名前なので、次のようにします。
        TimeZone.setDefault(TimeZone.getTimeZone("JST"));
    
    これは、最初に1回だけ実行すればよいので、init メソッドの中に書きます。
  2. now.toString() の代わりに、次のようにして文字列に変換します。
        DateFormat.getDateTimeInstance().format(now)
    
    DateFormat クラスは、日付や時刻をいろいろな形式で表示するためのクラスです。これを使うには、
        import java.text.*;
    
    が必要です。

今週は宿題はありません。ミニプロジェクトに集中してください。
[目次] [前回] [次回] [重要語索引]

慶應義塾大学の授業以外での無断利用、複製はご遠慮下さい。
Copyright (c) 2000 慶應義塾大学