PaintCanvas.java



/** 描画可能なキャンバス PaintCanvas クラス */
import java.awt.*;
import java.awt.geom.*;
import java.awt.image.*;
import java.awt.event.*;
public class PaintCanvas extends Canvas {

 /** 描画に利用する Pen のオブジェクト */
    private Pen pen;

 /** Pen のオブジェクトを設定するメソッド */
    public void setPen( Pen pen ) {
        this.pen = pen;
    }   

 /** Pen のオブジェクトを返すメソッド */
    public Pen getPen() {
        return pen;
    }   

 /** 描画される線の座標値 */
    private int x1,y1,x2,y2;

/** キャンバスのサイズ */
    private static Dimension defaultSize
                = new Dimension( 640, 400 );
    private Dimension oldSize;

 /** オフスクリーン */
    protected BufferedImage offScreen;

 /** オフスクリーンの書き込み用のグラフィックス */
    protected Graphics2D offGraphics;

 /** コンストラクタ */
    public PaintCanvas(){
        super();
        setBackground( Color.white );
        setSize( defaultSize );
        oldSize = defaultSize;
        Adapter adapter = new Adapter();
        addMouseListener( adapter );
        addMouseMotionListener( adapter );
    }   

 /** 起動時、絵の復活の時に呼び出される */
    public void paint( Graphics g ) {
        if( offScreen == null | offGraphics == null |
            oldSize == null | !(getSize().equals( oldSize ))  ) {
            Dimension newSize = getSize();
            offScreen
               = new BufferedImage( newSize.width, newSize.height,
                                    BufferedImage.TYPE_INT_RGB );
            offGraphics = offScreen.createGraphics();
            WritableRaster raster = offScreen.getRaster();
            int[] data = { 255, 255, 255 };
            for( int j=0; j<newSize.height; j++ )
               for( int i=0; i<newSize.width; i++ )
                  raster.setPixel( i, j, data ); // 初期化
            oldSize = newSize;
        }
        else {
           ((Graphics2D)g).drawRenderedImage( offScreen, null );
        }
    }

 /** グラフィックを描く */
    public void update( Graphics g ) {
        Line2D.Float line = new Line2D.Float(
             (float)x1, (float)y1, (float)x2, (float)y2 );
        g.setColor( pen.getColor() );
        ((Graphics2D)g).setStroke( pen.getBasicStroke() );
        ((Graphics2D)g).draw( line );
        offGraphics.setColor( pen.getColor() );
        offGraphics.setStroke( pen.getBasicStroke() );
        offGraphics.draw( line );
        x1 = x2;
        y1 = y2;
    }
 
  /** マウスイベントを処理する innerクラス */
    class Adapter implements MouseListener, MouseMotionListener {
 
    /** マウスイベント処理のメソッド */
        public void mousePressed( MouseEvent evt ) {
            x1 = evt.getX();
            y1 = evt.getY();
        }
        public void mouseDragged( MouseEvent evt ) {
            x2 = evt.getX();
            y2 = evt.getY();
            repaint();
        }
        public void mouseEntered( MouseEvent evt ) { }
        public void mouseExited( MouseEvent evt ) { }
        public void mouseReleased( MouseEvent evt ) { }
        public void mouseClicked( MouseEvent evt ) { }
        public void mouseMoved( MouseEvent evt ) { }
    }
}