前節のプログラムをインターフェースShapeと
クラスGraphics2Dを利用して作成してみましょう。
「AからBに線を引く」のではなく、
「直線の始点をAに、終点をBに設定して、その直線を描く」
という考え方になります。描画の(ペンの)太さも指定できますから、
前節ののように「5本の線を描いて太くみせる」のではなく、
「太さを指定する」ことになります。
点や線といったオブジェクトになれて下さい。
Shape と Graphics2D については Appendix にまとめる予定です。
ソースプログラムは、 Graph9.java です。
実行結果
プログラムの概要
マウスがドラッグされている間、短い線を描き続けます。
プログラム Graph9.java は、クラス G2Canvas と クラス Graph9 から構成されています。
プログラムの詳細
- (7〜9行目)新規追加 の import
- java.awt.geom には、
線 Line2D.Double といった Shape インターフェースを実装したクラスや、
点 Point2D.Double などが定義されています。
- (11〜59行目)
- クラス G2Canvas の定義
- (12行目)
- 点を生成し p1 という名前をつけておく。始点として用いる。
- (13行目)
- 点を生成し p2 という名前をつけておく。終点として用いる。
- (14行目)
- 直線を生成し line という名前をつけておく。
- (15行目)
- 描画をする領域(イメージ)
最初に描画する際に生成する(42行目)。
描画する領域を最初の一回だけ初期化するために、初期値を null にしておく。
(41〜47行目は最初の一回だけ実行する)
- (16行目)
- 描画を領域の Graphics2D を取得した際に付ける名前
ここに 描画(draw)することで、描いたものが保持される(ペイント系の描画)。
- (22〜36行目)
- コンストラクタ
- (23〜29行目)
- アダプタを用いてマウス・モーション・リスナを設定します。
- (24〜28行目)
- mouseDragged メソッドのオーバーライド
マウスがドラッグしているときに次々に呼び出されます。
- (25行目)
- 前回の描画の終点を今回の始点にします。
ここで、p1 = p2; とやってはいけません。
理由
- (26行目)
- ドラッグしていることが検出された時点の座標を今回の描画の終点にします。
- (27行目)
- 自分自身(65行目の new でつくられた G2Canvas のインスタンス)を
再表示するように依頼します。一旦Javaのシステムに飛び込んでから、
39〜55行目の paintComponent メソッドがコールバックされてきます。
- (30〜35行目)
- アダプタを用いてマウス・リスナを設定します。
- (31〜34行目)
- MousePressed メソッドのオーバーライド
マウスボタンが押されたときに呼び出されます。
- (32〜33行目)
- マウスカーソルの座標をを始点と終点に設定します。
ここも、p2 = p1; とやってはいけません。
- (38行目)
- 次の行の paintComponent がオーバーライドであることを明示しています。
paintComponent のつづりを間違えた場合には、エラーを表示してくれます。
- (39〜55行目)
- paintComponent メソッドのオーバーライド
最初に画面を表示する時、プログラムで repaint() が呼ばれた時、
その他システムが画面を再描画する必要があると判断した時にコールバックされます。
- (40〜48行目)
- 画面を最初に表示するときだけ実行します。
- (41行目)
- パネルの幅と高さを取得し、
- (42行目)
- おなじ大きさの BufferedImage を作成し image という名前をつけ、
- (43行目)
- image の Graphics2D に imageGraphics という名前をつけておきます。
- (44〜45行目)
- imageGraphics に対して、 setBackground と clearRect を実行することによって
image 全体を背景色で塗つぶしています。
- (46行目)
- 描画色を設定します。
- (47行目)
- 描画の太さ(ペンの太さ)を 3.0 に設定しておきます。
BasicStroke の引数は Float です。
- (49〜53行目)
- 始点と終点が離れている場合に実行します。
点が等しいかどうかの判定を (p1 == p2)
とか (p1 != p2) とやってはいけません。
理由
- (50行目)
- 直線の始点と終点を指定します。
この p1 とp2 は、マウスがドラッグされた場合(24〜28行目)や、
マウスが押された場合(31〜34行目)に設定されたものです。
- (51行目)
- その直線を描画します。
- (52行目)
- 描画し終わったので、始点の位置を終点に移動しておきます。
今回の描画の終了位置が、次の描画の開始位置になります。
- (54行目)
- できたイメージを g に書き込みます。
これにより G2Canvas のインスタンスに画が表示されます。
G2Canvas の親の描画 super.paintComponent(g) をせずに描画していますが、
G2Canvas 全体に image を drawImage しているので大丈夫のようです。
- (58行目)
- G2Canvas の大きさが知りたい場合にコールバックされます
- (61〜69行目)
- クラス Graph9 と main メソッドの定義
ウィンドウの生成と、G2Canvas のインスタンスの生成と貼り付け。
ウィンドウサイズの調整とウィンドウの表示。(ここで、58行目がコールバックされる)