Draw

こんどは、 Draw 系コンポーネントである CustomViewの解説です。

こちらは、MVC モデルに基づいて、「Model=描画すべき四角形群の情報」に応じた「View=描画ルーチン」 および「Control」を自分で定義していくことになります。

Model の作成

まずは Model ですね。四角形のリストを保持したいのですが、java.awt.Rectangleがあるので、それを使いましょう。List<Rectangle> shapesを準備しました。

点を追加するメソッドaddShape(Point, Point), 最期の図形を取り除くundo(), 全図形を取り除くreset() も作ってしまいましょう。

これで、モデルはほぼ完了ですね。

っていいたいところですが、入力中の図形を表示するためにModelを少し強化しておきます。 図形の入力は、マウスをpressして(始点)、ドラッグ中の座標は終点候補で、リリースしたタイミングで終点確定となります。 始点をPoint dragBegin, 終点候補をPoint dragCurrentと、フィールドとして設けましょう。 図形入力中は dragBegin, dragCurrentnullでない値をとることとします。

描画ルーチンの作成

Model を表示するためのメソッドを作成しましょう。paintComponent(Graphics) です。 ここでも、inteface の規約にのっとってシステムがユーザ定義関数を呼び出すってことがおこなわれています。

java.awt.Graphics には、描画用のメソッドがあるので、そちらをつかって図形を書きます。 描画中のものがある場合は、赤い四角で描画します。

@Override
public void paintComponent(Graphics g0) {
    Graphics2D g = (Graphics2D)g0;
    g.setBackground(Color.WHITE);
    g.clearRect(0, 0, getWidth(), getHeight());
    g.setColor(Color.BLUE);
    for(Rectangle rect: shapes) {
        g.fill(rect);
    }
    g.setColor(Color.RED);
    if(dragCurrent!=null)
        g.fill(genRect(dragBegin, dragCurrent));
}

実は、2D GUI アプリの場合、paintComponent(Graphics g) でもらう g は、java.awt.Graphics のサブクラスである java.awt.Graphics2D なので、ここでは型変換して、java.awt.Graphics2D の機能を利用します。

やっている中身は、

  • 画面を背景色(白)で塗って、
  • 各四角形を順番に塗って、
  • 描画中の四角があれば、それは赤で塗る

ってだけです。

Event 処理の中身

ユーザ操作は、「マウスをpressして(始点)、ドラッグ中の座標は終点候補で、リリースしたタイミングで終点確定」ってことなので、以下のハンドラを設けてみました。

てな感じです。それぞれ、CustomViewの以下のメソッドを呼ぶような event handler を、登録しています。

Modelを変更したら、再描画のための **repaint()** を呼ぶのをわすれないように。