Introduzione a Java ed Eclipse - 3 - 27

# Animare la palla - il sorgente

- Nel file MyPanelAnimazione.java scriveremo:

      package frameanimazione;

      import java.awt.Color;
      import java.awt.Dimension;
      import java.awt.Graphics;
      import java.awt.Image;
      import java.awt.Toolkit;

      import javax.swing.JPanel;

      public class MyPanelAnimazione extends JPanel implements Runnable {
      	private static final int WIDTH=400;
      	private static final int HEIGHT=300;

      	private static final long serialVersionUID = 1L;

      	private Image immagine;
      	private int x;
      	private int y;
      	private int dx;
      	private int dy;
      	private Thread animazione;

      	public MyPanelAnimazione() {
      		setPreferredSize(new Dimension(WIDTH, HEIGHT));
      		setBackground(new Color(0xff, 0xff, 0xcc));
      		x = WIDTH / 2;
      		y = HEIGHT / 2;
      		dx = 1;
      		dy = 1;
      		immagine = Toolkit.getDefaultToolkit().getImage("palla.png");
      		animazione = new Thread(this);
      		animazione.start();
      	}

      	@Override
      	protected void paintComponent(Graphics g) {
      		super.paintComponent(g);
      		g.drawImage(immagine, x - immagine.getWidth(this) / 2,
      			y - immagine.getHeight(this) / 2, this);
      	}

      	public void stop() {
      		animazione  = null;
      	}

      	public void eseguiAzione1() {
      		dx *= -1;
      	}

      	public void eseguiAzione2() {
      		dy *= -1;
      	}

      	@Override
      	public boolean imageUpdate(Image arg0, int infoFlags, int x, int y,
      			int width, int heignt) {
      		repaint();
      		return (infoFlags & ALLBITS) != ALLBITS;
      	}

      	@Override
      	public void run() {
      		while (Thread.currentThread() == animazione) {
      			x += dx;
      			y += dy;
      			if (x < immagine.getWidth(this) / 2) {
      				dx = 1;
      			} else if (x > WIDTH - immagine.getWidth(this) / 2) {
      				dx = -1;
      			}
      			if (y < immagine.getHeight(this) / 2) {
      				dy = 1;
      			} else if (y > HEIGHT - immagine.getHeight(this) / 2) {
      				dy = -1;
      			}
      			repaint();
      			try {
      				Thread.sleep(20);
      			} catch (Exception e) {
      			}
      		}
      	}

      }

- Nel file MyFrameAnimazione.java copieremo il contenuto di MyFrameImmagine, cambiando solo il package, la classe del pannello e le etichette di b1 (Rimbalza Verticale) e b2 (Rimbalza Orizzontale) ed aggiungere, nella gestione del bottone fine una invocazione del metodo disegno.stop();
- Nel main come al solito cabieremo solo il nome della classe della finestra.

© Ing. Stefano Salvi - released under FDL licence