超シンプル描画ツール


[描画方法]
@色パレットから色を選択し,描画ツールバーから図形を選択
Aマウスでドラッグすれば描画できる。
B[全てクリア]をクリックすれば,全ての描画が消去できる。
C[部分クリア]を選択し,消したい部分を囲うように四角形を作れば,その部分だけ消去できる。

Java applettです


ソースコード

import java.applet.*;
import java.awt.*;

public class ja204 extends Applet
{
  ja204Bar colorBar;		//色パレットのインスタンス変数
  ja204Bar2 toolBar;		//描画ツールバーのインスタンス変数

  int w,h;			//Appletの幅と高さ
  int startX,startY,endX,endY;	//mouseDown,mouseUp時のX,Y座標
  int dragX,dragY;		//mouseDrag時のX,Y座標

  boolean outcolorBar = false;	//クリック位置が,色パレット/ツールバー内かどうかを判定する
  boolean outtoolBar = false;

  public void init(){
    setBackground(Color.white);	//Appletの背景色を白に
    Dimension d = size();	//Appletのサイズを取得し,変数w,hに格納
    w = d.width;
    h = d.height;
    colorBar = new ja204Bar(10,10,360,20);	//色パレットを生成
    toolBar = new ja204Bar2(10,35,360,20);	//描画ツールバーを生成
  }

  public void paint(Graphics g){
	update(g);
  }

  public void update(Graphics g){
    colorBar.paint(g);			//色パレットを描画する(class ja204Bar参照)
    toolBar.paint(g);			//描画ツールバーを描画する(class ja204Bar2参照)
    int aW,aH;				//四角形と円の描画時の,幅と高さ

    if(outcolorBar && outtoolBar){	//MouseDown位置が色パレット/ツールバーの外の場合
	g.setColor(colorBar.colors[colorBar.selectC]);	//色パレットで現在選択されている色
	if(startY < 65) startY = 65; 	//ツールバーより上部に描画できないようにする
	if(endY < 65) endY = 65;
	if(dragY < 65) dragY = 65;

	if(toolBar.selectT == 0){	//ツールバーで[直線]が選択されている場合
	  g.drawLine(startX,startY,endX,endY);
	  g.setColor(Color.black);
	  g.drawString(startX + ":" + startY,startX,startY);
	  g.drawString(endX + ":" + endY,endX,endY);
	}
	if(toolBar.selectT == 1){		//ツールバーで[四角形]が選択されている場合
	  g.setColor(Color.black);
	  g.drawString(startX + ":" + startY,startX,startY);
	  g.drawString(endX + ":" + endY,endX,endY);		//直線を描画

	  if(endX < startX){		//mouseDown位置より左でmouseUpされて場合
	    aW = startX - endX;
	    startX = endX;
	  } else {
	    aW = endX - startX;
	  }
	  if(endY < startY){		//mouseDown位置より上でmouseUpされて場合
	    aH = startY - endY;
	    startY = endY;
	  }else{
	    aH = endY - startY;
	  }
	  g.setColor(colorBar.colors[colorBar.selectC]);
	  g.drawRect(startX,startY,aW,aH);		//四角形を描画
	}
	if(toolBar.selectT == 2){	//ツールバーで[円形]が選択されている場合
	  if(endX < startX){		//mouseDown位置より左でmouseUpされて場合
	    aW = startX - endX;
	    startX = endX;
	  } else {
	    aW = endX - startX;
	  }
	  if(endY < startY){		//mouseDown位置より上でmouseUpされて場合
	    aH = startY - endY;
	    startY = endY;
	  }else{
	    aH = endY - startY;
	  }
	  g.drawOval(startX,startY,aW,aH);		//円形を描画
	}
	if(toolBar.selectT == 3){	//ツールバーで[自由曲線]が選択されている場合
	  g.drawLine(dragX,dragY,startX,startY);	//直線を描画
	}
	if(toolBar.selectT == 5){		//ツールバーで<部分クリア>を選択した場合
	  if(endX < startX){			//mouseDown位置より左でmouseUpされて場合
	    aW = startX - endX;
	    startX = endX;
	  } else {
	    aW = endX - startX;
	  if(endY < startY){			//mouseDown位置より上でmouseUpされて場合
	    aH = startY - endY;
	    startY = endY;
	  }else{
	    aH = endY - startY;
	  }
	    g.clearRect(startX,startY,aW,aH);	//指定範囲をクリア(背景色で塗り潰す)
	  }
	}

	if(!outtoolBar && toolBar.selectT == 4){		//ツールバーで<全てクリア>を選択した場合
	  g.clearRect(0,56,w,h - 56);		//描画領域全体ををクリア(背景色で塗り潰す)
	}
     }

    public boolean mouseDown(Event evt,int x,int y){
	//mouseDown位置が色パレット,描画ツールバー内かどうかを調べ,フラグ変数(outcolorBar,outtoolBar)
	//に<true>か<false>かを設定。それにより動作を分岐さす。
	startX = x;
	startY = y;

	if(colorBar.inside(x,y)){		//ja204Barクラスのinsideメソッドがtrueを返した場合
	  outcolorBar = false;
	  repaint();
	  return true;
	}else{
	  outcolorBar = true;
	}

	if(toolBar.inside(x,y)){	//ja204Bar2クラスのinsideメソッドがtrueを返した場合
	  outtoolBar = false;
	  repaint();
	  return true;
	}else{
	  outtoolBar = true;
	}
		return true;
    }

    public boolean mouseDrag(Event evt,int x,int y){
	if(toolBar.selectT == 3){			//ツールバーで[自由曲線]が選択されている場合
		dragX = x;
		dragY = y;
		repaint();

		startX = x;
		startY = y;
	}
	return true;
    }

    public boolean mouseUp(Event evt,int x,int y){
	endX = x;
	endY = y;
	repaint();
	return true;
    }
}

class ja204Bar			//色パレットを生成するクラス
{
  int barX,barY;		//色パレットの左上座標
  int barW,barH;		//色パレットの幅と高さ
  int selectC = 0;	//色配列で,現在選択されている色Index(デフォルトで赤を設定)
  static Color colors[] = {Color.red,Color.pink,Color.orange,Color.yellow,Color.green,Color.blue,Color.magenta,Color.cyan,Color.black};
	
  public ja204Bar(int x,int y,int w,int h){		//コンストラクタを定義
	barX = x;			//色パレット全体の位置とサイズを得る
	barY = y;
	barW = w;
	barH = h;
  }
	
  void paint (Graphics g){		//色パレットを描画する
    int x,y,w,h;			//色パレットの各色の左上座標と幅,高さ
		
    for (int i=0;i<colors.length;i++){	//各色パレットを描画する
	w = barW/colors.length;;
	h = barH;
	x = barX + (i * w);
	y = barY;
	g.setColor(Color.gray);		//各色パレットの枠を作る
	g.fillRect(x,y,w,h);

	if(i == selectC){		//現在選択されている色の場合,枠を少し大きくする
		x += 3;
		y += 3;
		w -= 6;
		h -= 6;
	}else{
		x += 1;
		y += 1;
		w -= 2;
		h -= 2;
	}
	g.setColor(colors[i]);	//色配列にしたがい,各色パレットを作る
	g.fillRect(x,y,w,h);
    }
  }

  boolean inside(int x,int y){		//MouseDown位置を調べる
    int i,w;
    if(x < barX || x > barX + barW)return false;	//色パレットの外の場合,falseを返す	
    if(y < barY || y > barY + barH)return false;

    w = barW / colors.length;			//色パレット内の場合
    for(i = 0;i < colors.length;i+=1){
      if(x <barX + (i + 1) * w){		 //MouseDown位置のx座標が,どの色か調べる
	selectC = i;				//色Indexを設定
	return true;
      }
    }
    return false;
  }
}

class ja204Bar2			//描画ツールを生成するクラス
{
  int barX,barY;		//ツールバーの左上座標
  int barW,barH;		//ツールバーの幅と高さ
  int selectT = 0;		//ツールボタンで,現在選択されているツール配列Index(デフォルトで直線を設定)
  static String tool[] = {"直線","四角形","円形","自由曲線","全てクリア","部分クリア"};
	
  public ja204Bar2(int x,int y,int w,int h){		//コンストラクタを定義
	barX = x;
	barY = y;
	barW = w;
	barH = h;
  }

  void paint (Graphics g){		//ツールバーを描画する
    int x,y,w,h;				//ツールバーの各ボタンの左上座標と幅,高さ
		
    for (int i=0;i<tool.length;i++){		//ツールバーの各ボタンを描画する
	w = barW/tool.length;;
	h = barH;
	x = barX + (i * w);
	y = barY;
	g.setColor(Color.gray);
	g.fillRect(x,y,w,h);

	if(i == selectT){			//選択されたツールバーボタンは,赤色で表示する
		g.setColor(Color.yellow);
	}else{					//その他は青色で表示する
		g.setColor(Color.blue);
	}
	g.drawString(tool[i],barX + (i * w) + 3,barY + 16);	//ボタン名を表示
    }
  }

  boolean inside(int x,int y){		//MouseDown位置を調べる
	int i,w;
	if(x < barX || x > barX + barW)return false;	//ツールバーの外の場合,falseを返す	
	if(y < barY || y > barY + barH)return false;

	w = barW / tool.length;				//ツールバー内の場合
	for(i = 0;i < tool.length;i+=1){
	  if(x <barX + (i + 1) * w){		 //MouseDown位置のx座標が,どのツールか調べる
		selectT = i;			//ツールIndexを設定
		return true;
	  }
	}
	return false;
  }
}

末尾