12. 1 画像 12. 2 音声 12. 3 練習問題 12. 4 乱数 12. 5 練習問題 12. 6 時間 12. 7 練習問題
アプレットでは、画像ファイルを URL で指定して、キャンバスなどに表示することができます。
Graphics クラスのインスタンスに対してdrawImage メソッドを呼び出します。
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); // キャンバスを配置する } } |
アプレットでは、音声ファイルの 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"); // 音を鳴らす
}
}
|
自分で画像ファイルと音声ファイルを作り、画像をキャンバスに表示し、ボタンを押すと音声が流れるアプレットを作りなさい。
乱数は一見でたらめに見える数値の列です。これを使うと実行するたびに処理の内容を変化させることができます。
次のプログラムは、ボタンを押すたびにランダムな位置と半径で円を10個描きます。
12.4 乱数
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未満の整数
}
}
}
|
上のプログラムを変更し、いろいろな形の楕円をランダムに描くアプレットにしなさい。
時刻データを扱うには Date クラスを使います。
次のプログラムは、デジタル時計です。
12.6 時間
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(); // 再描画する
}
}
|
Java プログラムは、インターネットを通して世界のどこで実行されるか分かりませんから、Date クラスはグリニッジ標準時で表示するようになっています。これを日本標準時に変換して表示するようにしましょう。
TimeZone.setDefault(TimeZone.getTimeZone("JST"));
これは、最初に1回だけ実行すればよいので、init メソッドの中に書きます。
DateFormat.getDateTimeInstance().format(now)DateFormat クラスは、日付や時刻をいろいろな形式で表示するためのクラスです。これを使うには、
import java.text.*;が必要です。
慶應義塾大学の授業以外での無断利用、複製はご遠慮下さい。
Copyright (c) 2000 慶應義塾大学