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, dragCurrent
は null
でない値をとることとします。
描画ルーチンの作成
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して(始点)、ドラッグ中の座標は終点候補で、リリースしたタイミングで終点確定」ってことなので、以下のハンドラを設けてみました。
- java.awt.event.MouseListener の
mousePressed(MouseEvent)
に、始点を取得する処理を登録。java.awt.event.MouseAdapter というのは、MouseListener
の各メソッドを空メソッドで実装したクラスです。 - java.awt.event.MouseMotionListener の
mouseDraggedssed(MouseEvent)
で、ドラッグ中の終点候補を更新 - java.awt.event.MouseListener の
mouseReleased(MouseEvent)
で、終点確定時の処理を実現
てな感じです。それぞれ、CustomView
の以下のメソッドを呼ぶような event handler を、登録しています。
Modelを変更したら、再描画のための **repaint()** を呼ぶのをわすれないように。