310044B 大原隼一 イメージを読み込んだ画像に雪を書き込むプログラム。 GUI部品を使って雪を消すことができる。

//< applet code=Kadai1209 width=400 height=400> < /applet>
// アプレットを使うため
import java.applet.*;
// AWT を使うので,java.awt.* を import する.
import java.awt.*;
// イベント処理をおこなうので,
import java.awt.event.*;
// イメージを使うので
import java.awt.image.*;
// Vectorクラスを用いるため
import java.util.*;

// 雪の座標クラスを定義する.
class Snow{
    // 始点,終点のX座標,Y座標を int で保持する.
    public int start_x,start_y,end_x,end_y;
    // Snowのコンストラクタ
    public Snow(int x1,int x2,int x3,int x4){
	start_x=x1;
	start_y=x2;
	end_x=x3;
	end_y=x4;
    }
}

// Canvasクラスのサブクラスとしてお絵書き領域を作る
class MyCanvas extends Canvas implements KeyListener{
    // Snowの配列を保持するVectorクラスの変数 snowArrayの宣言
    Vector snowArray;
    boolean dragging;
    Color snowColor;
    Image image;
    public MyCanvas(){
	super();
	image=Toolkit.getDefaultToolkit().getImage(getParameter("image"));
	snowArray=new Vector();
	dragging=false;
	// 雪の色は白に
	snowColor=Color.white;
	setSize(400,400);
	addKeyListener(this);	
	
    
	//マウスボタンが押された時のマウスカーソルの位置を得る
	addMouseListener(new MouseAdapter(){
		public void mousePressed(MouseEvent e){
		int mx=e.getX(),my=e.getY();
		System.out.println("mousePressed("+e+","+mx+","+my+")");
		snowArray.addElement(new Snow(mx,my,mx,my));
		dragging=true;
		repaint();
		}
		//マウスのボタンが離された時マウスカーソルの位置を得る
		public void mouseReleased(MouseEvent e){
		    int mx=e.getX(),my=e.getY();
		    System.out.println("mouseUp("+e+","+mx+","+my+")");
		    Snow l=(Snow)snowArray.elementAt(snowArray.size()-1);
		    l.end_x=mx;
		    l.end_y=my;
		    dragging=false;
		    repaint();
		}
	    });
	// マウスボタンがドラッグされたときのカーソルの座標を得る
	addMouseMotionListener(new MouseMotionAdapter(){
		public void mouseDragged(MouseEvent e){
		    int mx=e.getX(),my=e.getY();
		    System.out.println("mouseDrag("+e+","+mx+","+my+")");
		    Snow l=(Snow)snowArray.elementAt(snowArray.size()-1);
		    l.end_x=mx;
		    l.end_y=my;
		    repaint();
		}
	    });
    }
    //qを押すと終了
    public void keyPressed(KeyEvent e){
	// イベントからキーのコードを取り出す
	int key=e.getKeyChar();
	// デバッグ用の表示
	System.out.println("keyPressed("+e+","+key+")");
	// 入力が 'q'の時は終了する
	if(key=='q') System.exit(0);
    } 
    public void keyReleased(KeyEvent e){}
    public void keyTyped(KeyEvent e){}

    // Deleteボタンが押されたら一つ雪を消す
    public void deleteSnow(){
	int size;
	if((size=snowArray.size())>0){
	    snowArray.removeElementAt(size-1);
	    repaint();
	}
    }
    // Clear ボタンが押されたら雪をすべて消す
    public void clearsnow(){
	snowArray.removeAllElements();
	repaint();
    }

    //次の画面のイメージを作る
    public void update(Graphics g){
	paint(g);
    }
    
    //初めにイメージを表示し、得られた座標にしたがって雪を描く
    public void paint(Graphics g){
	g.drawImage(image,0,0,this);
	int i;
	g.setColor(snowColor);
	int size=snowArray.size();
	if(dragging) size--;
	for(i=0;i< size;i++){
	    Snow l=(Snow)snowArray.elementAt(i);
	    g.fillOval(l.start_x,l.start_y,l.end_x-l.start_x,l.end_y-l.start_y);
	}
	if(dragging){
	    // 赤い色で
	    g.setColor(Color.red);
	    Snow l=(Snow)snowArray.elementAt(i);
	    g.fillOval(l.start_x,l.start_y,l.end_x-l.start_x,l.end_y-l.start_y);
	}
    }
}

//アプレットクラスのサブクラスとして Kadai1209を定義
public class Kadai1209 extends Applet implements ActionListener{
    MyCanvas myCanvas;
    Button deleteButton,clearButton;
    Image image;
    //アプレット作成時に initが呼ばれる
    public void init(){
	//GUI部品の作成
	Panel panel=new Panel();
	panel.setLayout(new FlowLayout());
	panel.add(deleteButton=new Button("Delete"));
	deleteButton.addActionListener(this);
	panel.add(clearButton=new Button("Clear"));
	clearButton.addActionListener(this);
	setLayout(new BorderLayout());
	add(panel,"North");
	add(myCanvas=new MyCanvas(),"South");
	setSize(getPreferredSize());
	setVisible(true);
	Kadai1209 frame=new Kadai1209();
	frame.image=getImage(getCodeBase(),"test.png");
    }

    //ActionListenerを実装するためのメソッド
    public void actionPerformed(ActionEvent e){
	System.out.println(e);
	Object source=e.getSource();
	if(source.equals(deleteButton)){
	    myCanvas.deleteSnow();
	}
	// Clearボタンが押された時
	else if(source.equals(clearButton)){
	    myCanvas.clearsnow();
	}
    }
}