これを保存してコンパイルすると、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