ドラッグによるお絵かきプログラム

ファイルはzipフォルダに納められています。
解凍ソフト(Aladdin Expander等)を使って解凍して下さい。

2つのインターフェースのimplements

お絵かきプログラムでは、「マウスが押された」イベントと「マウスがドラッグされた」イベントを検出して、それぞれに処理を記述しますが、前者を検出するのは「MouseListener」で有り、後者は「MouseMotionListener」なので、2つのインターフェースをimplementsする必要が有ります。
複数のインターフェースをimplementsする時は、コンマ(,)で区切って並べて書きます。

例: public class クラス名 extends Frame implements MouseListener, MouseMotionListener{

2つのアダプタの使用

2つのリスナのそれぞれに対してアダプタが用意されているので、アダプタを使う時には、2つのアダプタをそれぞれ「extends」した2つのクラスを作ります。
尚、2つのインターフェースを両方implementsしたアダプタ「MouseInputAdapter」が「javax.swing.event」パッケージに用意されているので、此を使うと便利です。

お絵かきプログラムのアルゴリズム

お絵かきプログラムでは、マウスが押された時折れ線の描画を開始し、ドラッグされる度に前の点から現在の点迄直線を描画します。

右クリックの検出〜もう1つの方法〜

SwingUtilitiesクラスには、マウスのクリックがどのボタンによる物だったかを判定する以下の様なメソッドが用意されています。

static boolean isLeftMouseButton(MouseEvent)
static boolean isMiddleMouseButton(MouseEvent)
static boolean isRightMouseButton(MouseEvent)

何れも「static」の付いたクラスメソッドなので、SwingUtilitiesクラスのインスタンス化されたオブジェクトを用意する必要はなく、引数にMouseEventクラスのオブジェクトを指定して、メソッドを呼び出せます。
尚、SwingUtilitiesクラスは「javax.swing」パッケージに有るので、プログラムの先頭で此のパッケージをimportする必要が有ります。

2つの座標から四角形を描くには

マウスを押した点と、ドラッグイベントが発生して出来た点の2つを頂点とする四角形を描きます。
「g.drawRect」では、左上隅の座標と幅と高さを指定しますが、必ずしもマウスを押した点が左上になっているとは限らないので、x座標、y座標それぞれについて、小さい方の座標値が左上の点となります。
幅は2点のx座標の差で求められ、高さは2点のy座標の差で求められます。
何れも、正の数でなければなりません。
2つの数値の小さい方を選ぶには、Mathクラス「min()」メソッドが便利です。
又、絶対値(正の数)を求めるには、Mathクラスの「abs()」メソッドが便利です。

paintメソッドの仕事

paintメソッドは、再描画が必要になった時に呼び出されるメソッドです。
「paint()」が呼び出される時には、其の前に画面は全てクリアされます。
其の為、何も表示されていない白い画面に対して「paint()」に描かれた描画が始まります。

再描画要求

画面のサイズが変わったり、画面がフォーカスを得たりした時は、自動的に「paint()」が呼び出され、再描画が行われます。
しかし、イベントが発生した事が原因で表示内容を変化させたい場合には、強制的に再描画を発生させる必要が有ります。
其の様な時には、「repaint()」メソッドを呼び出します。
「repaint()」メソッドでは、再描画のイベントを発生するので、其の結果「paint()」が呼び出されます。
Mouse5.java等迄は描いた直線を消去せずに描き溜めるプログラムでしたが、Mouse6.java等ではマウスの動きと共に、新しい図形のみ表示するので、「paint()」の画面消去を利用し直前の図形を消してから、最新の図形だけを表示します。

破線の描画

破線を描くには、Graphics2Dクラスでストロークの指定をします。
Graphics2Dクラスは、Graphicsクラスを継承したクラスなので、

Graphics2D g2 (Graphics2D)g;

の様に、Graphics2Dクラスのオブジェクト「g2」を求められます。
破線のストロークは、BasicStrokeクラスのオブジェクトとしてMouse6A.javaの様に設定します。

ソース ダウンロード
Mouse5.java Mouse04.zip
Mouse5A.java
Mouse5B.java
Mouse6.java
Mouse6A.java

戻る