/* * Scrivere: * Un'interface 'listable' che preveda: * 1.Un metodo 'aggiungi' che aggiunga l'elemento ad una lista data come parametro * 2.Un metodo 'paint' che riceva come parametro un oggetto Graphics, che 'disegni' l'oggetto * 3.Un metodo 'in' che riceve due coordinate come parametri e indichi se il punto dato appartiene alla figura listata * Una classe limage che possegga un' 'Image', implementi 'listable' e possegga come attributi una coppia di coordinate, * inizializzate dal costruttore * Una classe quadrato che implementi 'listable' e disegni un quadrato di dimensione data, alla posizione indicata dal * costruttore * Un applet che, ogni volta che viene premuto il tasto del mouse, disegni una pallina (Image) se il mouse è stato premuto * sullo sfondo o un quadrato, se è stato premuto su una pallina. Tutti gli oggetti creati saranno contenuti in una lista di * 'listable' */ import java.awt.*; import java.awt.Image; import java.awt.image.ImageObserver; import java.applet.Applet; // Interfaccia per oggetti 'listabili' interface listable { listable aggiungi (listable toadd); // Aggiunge l'oggetto alla lista void paint (Graphics g); // Disegna l'oggetto boolean in (int x, int y); // Controlla se il mouse sta' nell'area data listable getNext (); // Restituisce il prossimo oggetto }; // Classe limage, non puo' derivare da un'immagine (che e' una classe astratta) // Costituisce un'immagine (di dimensione w=20, h=20) in posizione fissa class lmage implements listable { static final int w = 20; // Larghezza predeterminata static final int h = 20; // Altezza predeterminata ImageObserver o; // il proprietario dell'immagine (un ImageObserver) int x,y; // la posizione dell'immagine listable next; // Il prossimo elemento della lista Image i; // L'immagine da visualizzare // Costruttore che semplicemente inizializza gli attributi public lmage (int px, int py, Image img, ImageObserver obs) { x = px; y = py; o = obs; i = img; } // Metodo che attacca la lista (toadd) in coda all'elemento e ritorna l'elemento // come nuovo inizio lista public listable aggiungi (listable toadd) { next = toadd; return this; } // Metodo che chiama la paint del resto della lista, poi desegna se stesso public void paint (Graphics g) { if (next != null) { next.paint (g); } g.drawImage (i, x, y, o); // Disegna l'immagine alle coordinate memorizzate } // Confronta le coordinate public boolean in (int isx, int isy) { return isx >= x && isx <= (x + w) && isy >= y && isy <= (y + h); } // Ritorna il prossimo elemento della lista public listable getNext () { return next; } } class quadrato implements listable { static final int w = 20; // Larghezza predeterminata static final int h = 20; // Altezza predeterminata int x,y; // la posizione del quadrato listable next; // Il prossimo elemento della lista // Costruttore che semplicemente inizializza gli attributi quadrato (int px, int py) { x = px; y = py; } // Metodo che attacca la lista (toadd) in coda all'elemento e ritorna l'elemento // come nuovo inizio lista public listable aggiungi (listable toadd) { next = toadd; return this; } // Metodo che chiama la paint del resto della lista, poi desegna se stesso public void paint (Graphics g) { if (next != null) { next.paint (g); } g.drawLine (x, y, x, y + h); g.drawLine (x, y + h, x + w, y + h); g.drawLine (x + w, y + h, x + w, y); g.drawLine (x + w, y, x, y); } // Confronta le coordinate public boolean in (int isx, int isy) { return isx >= x && isx <= (x + w) && isy >= y && isy <= (y + h); } // Ritorna il prossimo elemento della lista public listable getNext () { return next; } } public class interfacetest extends Applet { private Image dot = null; // L'immagine da muovere sullo schermo private listable l; public void init () { // Metodo chiamato all'avvio dell'applet dot = getImage(getCodeBase(), "lista.gif"); // Lancia il caricamento dell'immagine } // Gestisce l'evento della pressione del mouse public boolean mouseDown(Event evt, int x, int y) { listable c = l; while (c != null) { // Percorre la lista, fino a che e' finita if (c.in (x,y)) // Se il mouse e' nell'area break; // Interropme il ciclo c = c.getNext (); // Altrimenti va al prossimo elemento } if (c == null) { // Se ha esaurito la lista (non e' all'interno di un oggetto c = new lmage (x,y,dot,this); // Costruisce l'immagine } else { c = new quadrato (x,y); // Altrimenti, costruisce il quadrato } l = c.aggiungi (l); // Quindi aggiunge l'oggetto creato alla lista repaint (); // Ridisegna return true; // E lascia il sistema gestire il resto } synchronized public void paint(Graphics g) { // Metodo invocato per ridisegnare l'Applet if (l != null) { // Se la lista non e' vuota l.paint (g); // Chiede alla lista di ridisegnarsi (metodo ricorsivo) } } }