これを保存してコンパイルすると、Drawer.class, Drawer$1.class, Drawer$2.classという3つのファイルができる。
// 2次元整数配列を画面に表示するクラス
// Copyright (C) 2000 by Hidehiko Masuhara
// 使い方は DrawerSample.java を参照。
// Java のグラフィクスライブラリを使うための宣言
import java.awt.*;
import java.awt.event.*;
public class Drawer extends Frame {
// getColor が使う色の配列
static Color[] colors = new Color[] {
Color.blue, Color.cyan, Color.green, Color.magenta, Color.orange,
Color.pink, Color.red, Color.white, Color.yellow
};
// 与えられた整数に対応する色を返す
// ・大きな整数の場合、用意した色数で割った余りを色番号とする。
// ・負の数の場合は黒にする。
static Color getColor(int depth) {
if (depth >= 0) return colors[depth % colors.length];
else return Color.black; // 負の場合は黒
}
// 指定された点に与えられた色の点を打つ
static void putPixel(Graphics g, int x, int y, Color c) {
g.setColor(c); // 色をcに設定する
g.fillRect(x,y,1,1); // 1x1の正方形を描くことで代用する
}
// インスタンス変数 (ウィンドウごとに存在する変数)
int[][] depthMap; // 各点の色を決める配列
// コンストラクタ: 色を決める配列を覚えておく
Drawer(int[][] givenDepthMap) {this.depthMap = givenDepthMap;}
// ウィンドウが(再)表示されたときに呼ばれるメソッド
// ここで g に描画をするとそれが画面に表示される。
public void paint(Graphics g) {
// 色を決める配列の全ての要素について処理
for (int x = 0; x < this.depthMap.length; x++)
for (int y = 0; y < this.depthMap[x].length; y++) {
Color c = getColor(depthMap[x][y]); // 要素に対応する点を決める
putPixel(g,x,y,c); // その色で(x,y)に点を打つ
}
}
// ウィンドウを作り、与えられた2次元配列の内容を色分けして表示する
public static void show(int[][] depthMap) {
Frame f = new Drawer(depthMap); // Drawerオブジェクトを作る
// Closeボタンが押されたときの処理を設定しておく。
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
System.exit(0); // 押されたらプログラムを終了させる
}
});
// 画面をクリックされたときの処理も設定。
f.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent me) {
System.exit(0); // クリックされたらプログラムを終了させる
}
});
// 配列の大きさからウィンドウの大きさを決め、設定する。
f.setSize(depthMap.length, depthMap[0].length);
// ウィンドウを表示させる(するとシステムが paint メソッドを実行する)
f.show();
}
}
Hidehiko Masuhara, November 2000