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();
}
}
}
