・実行結果
枠の中でマウスをドラッグしてみてください。
・キャンバスクラス
今回は、白いキャンバスにマウスで線を描けるようにします。
ドラッグするとそこに線を描くようにしました。その「キャンバス」
には、文字どおりのCanvas クラスを継承したものを使います
(クラスについてはJavaプログラミング実験室
参照)。
このキャンバスには、イメージを保持してマウスがドラッグされたり、
ボタンが押されたらそのイメージに描画する、という機能を実装しましょう。
マウスの処理は、クラス内でマウス関連のイベントを捕らえれば良いですね。
大体、キャンバス用のクラスGedcv1
は以下のような感じになるでしょう。
class Gedcv1 extends Canvas { // キャンバス用クラス
private Image img;
private int w,h;
private Graphics g_img;
Gedcv1(Image im) { // コンストラクタ
w=200; // 大きさ設定
h=200;
resize(w,h);
img=im; // 渡されたイメージをキャンバスのイメージに設定
g_img=img.getGraphics(); // キャンバスに描画するGrahics
g_img.setColor(Color.white); // キャンバス初期化
g_img.fillRect(0,0,w,h);
g_img.setColor(Color.black);
g_img.drawRect(0,0,w-1,h-1);
g_img.setColor(Color.blue); // 描画色設定
}
public boolean mouseDown(Event evt,int x,int y) { // マウスイベント
if (x<1 || y<1 || x>w-3 || y>h-3) // 枠の部分なら戻る
return false;
g_img.fillRect(x,y,2,2); // 点を打つ
repaint();
return true;
}
public boolean mouseDrag(Event evt,int x,int y) {
if (x<1 || y<1 || x>w-3 || y>h-3) // 枠の部分なら戻る
return false;
g_img.fillRect(x,y,2,2);
repaint();
return true;
}
public void paint(Graphics g){
g.drawImage(img,0,0,this); // イメージを表示
}
public void update(Graphics g){
paint(g);
}
}
コンストラクタ(初期化関数)で、
イメージを外部(キャンバスを使うオブジェクト)から渡してもらっているのは、
Canvas オブジェクト内ではイメージを作れないみたいだからです。
もちろん、自分自身で処理したいという時は、
コンストラクタ内でイメージを作れる適当なクラスのオブジェクトを作って、
そのオブジェクトにイメージを作らせても良いでしょう。
渡されたイメージを白で初期化して枠を描けば、
後はキャンバスにマウスで描画されるのを待ちます。
マウスのイベント処理も単にイベントがおきた座標に青い点を打つだけなので、
特に問題はないでしょう。
キャンバス用クラスに一通りの機能を持たせたのでメインクラスの方は、
キャンバス用クラスのオブジェクトを作るだけです。
public class Ged1 extends java.applet.Applet { // メインクラス
Gedcv1 cv;
public void init(){
cv=new Gedcv1(createImage(200,200)); // キャンバス作成
add(cv); // キャンバス配置
}
}