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