計算機プログラミングI

配列の内容を色分けして表示するクラス

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