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

//大原 隼一 310044B
/*雪だるまと月の画像のイメージファイル(test.png)をファイルから読み込んで、その画像に雪を書き加える。さらに、GUI部品を使っての指示により線分を消去することができる。メニューバーのEXITメニューを選択するとプログラムを終了する。*/

// 
// アプレットを使うため
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 snow_x,snow_y;
    // Snowのコンストラクタ
    public Snow(int x1,int y1){
	snow_x=x1;
	snow_y=y1;
    }
}

// Canvasクラスのサブクラスとしてお絵書き領域を作る
class SCanvas extends Canvas implements KeyListener{
    // Snowの配列を保持するVectorクラスの変数 snowArrayの宣言
    Vector snowArray;
    boolean dragging;
    Color snowColor;
    Image image;
    public SCanvas(Image filename){
	super();
	image=filename;
	snowArray=new Vector();
	dragging=false;
	// 雪の色は白に
	snowColor=Color.white;
	setSize(400,400);
	addKeyListener(this);	
	
    
	//マウスボタンがClickされた時のマウスカーソルの位置を得る
	addMouseListener(new MouseAdapter(){
		public void mouseClicked(MouseEvent e){
		int mx=e.getX(),my=e.getY();
		System.out.println("mouseClicked("+e+","+mx+","+my+")");
		snowArray.addElement(new Snow(mx,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.snow_x,l.snow_y,10,10);
	}
	
    }
}

//アプレットクラスのサブクラスとして Kadai1216を定義
public class Kadai1216 extends Applet implements ActionListener{
    SCanvas sCanvas;
    Button deleteButton,clearButton;
    Image image;
    //アプレット作成時に initが呼ばれる
    public void init(){
	String filename=getParameter("image");
	//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");
	Image test=getImage(getCodeBase(), filename);
	add(sCanvas=new SCanvas(test),"South");
	setSize(getPreferredSize());
	setVisible(true);
	Kadai1216 frame=new Kadai1216();
    }

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