Newsgroup: it.comp.java
Titolo: Panel

Come si inserisce un immagine in un Panel??
               Grazie,Ciao.

               Grazie,Ciao.
- Crea una classe che estanda Canvas.
- supera paint(Graphics g) della nuova classe e fai in modo che visualizzi
l'immagine letta precedentemente (presumibilmente nel
costruttore).
Il gioco è fatto!
Calaoke.

Calaoke.
Grazie per l'aiuto, fin qua ci sono, ora pero' mi e' sorto un'ulteriore
problema, infatti l'immagine durante
l'esecuzione dell'applet deve cambiare. Nel modo che mi hai indicato tu, una
volta istanziata la classe
che estende Canvas non e' piu possibile cambiare immagine, o mi sbaglio.
                                Ciao.Mauro

                                 Ciao.Mauro
Nella classe che estende Canvas puoi mettere tutto il codice che ti serve:
ad esempio puoi attivare un thread che cicli varie immagini ogni tot
millisecondi (ie un'animazione ;-): inoltre puoi fare in modo che esegua
operazioni genrealmente gestite dall'applet (aprire pagine web etc.)
semplicemente passando al costruttore della classe il riferimento all'applet
chiamante.
Entro breve tempo ti sviluppo un'applet di esempio e te la spedisco.
MindFlavor.

Allego anche al NG la classe in questione: fatene ciň che volete ;-)
import java.awt.*;
import java.io.*;
import java.applet.*;
import java.net.*;
/**
 * Classe per visualizzare un animazione dentro un'applet.
 * @author MindFlavor
 * @version 1.0 (24-07-99)
*/
public class AnimatorCanvas extends Canvas implements Runnable {
Object statusBar;
URL dirURL;
Applet parent;
Image[] images;
boolean[] imgOk;
int numfiles;
MediaTracker mediat;
Image offscreen = null;
int count = -1;
/**
 * @field LETTER Lettera (o stringa) da usare come prefisso per le immagini.
*/
protected final static String LETTER = "T";
protected final static String WAIT_STR = "Attendere, prego... :-)";
public final static int SLEEP_TIME = 1000 / 10; // 10 frame al secondo...
private boolean imageReady = false;
/**
 * Costruttore: riceve l'applet che lo contiene, la URL che punta ai
 * files (in formato GIF) e il riferimento ad una status bar.
 * Quest'ultima puň essere una Label, una TextArea, una TextField, oppure
 * una Applet in caso si volesse usare la barra di stato del browser.
 * @param parent L'Applet che possiede l'AnimatorCanvas
 * @param dirURL L'URL con le GIF (in formato "T#" dove 1 < # < numFiles
 * @param statusBar La barra di stato (come descritto sopra)
 * @param numFiles Numero di immagini nella cartella (sempre da 1 a
numFiles)
 * @see java.applet.Applet
 * @see java.net.URL
 * @see java.lang.Object
 * @see java.awt.Label
 * @see java.awt.TextArea
 * @see java.awt.TextField
*/
public AnimatorCanvas(Applet parent, URL dirURL, int numFiles, Object
statusBar) {
 System.out.println("Applet = " + parent + "\ndirULR = " + dirURL);
 this.numfiles = numFiles;
 this.dirURL = dirURL;
 this.statusBar = statusBar;
 this.parent = parent;
 Thread t = new Thread(this);
 t.start();
 t.setPriority(Thread.MIN_PRIORITY);
}
/**
 * Thread principale. Non curarti di lui (carica le immagini e si occupa
dell'
 * animazione).
 * @see java.lang.Thread
 * @see java.lang.Runnable
*/
public void run() {
 showStatus("Settaggio in corso...");
 URL[] files = new URL[numfiles];
 for(int i=1; i<numfiles+1; i++) {
  try {
   files[i-1] = new URL(dirURL.getProtocol(), dirURL.getHost(),
      dirURL.getFile() + File.separator + LETTER + i + ".gif");
  } catch(MalformedURLException ex) {
   System.out.println("***Errore: " + ex);
  }
 }
 images = new Image[numfiles];
 imgOk = new boolean[numfiles];
 for(int i=0; i<numfiles; i++) imgOk[i] = false;
 mediat = new MediaTracker(this);
 for(int i=0; i<numfiles; i++) {
  showStatus("Caricamento immagine " + (i+1) + " su " + numfiles + " in
corso...");
  System.out.println("files["+i+"] == " + files[i]);
  images[i] = parent.getImage(files[i]);
  mediat.addImage(images[i], i);
 }
 mediat.checkAll(true); // forzo il caricamento...
 try
  mediat.waitForAll();
 } catch(InterruptedException e) { }
 if (mediat.isErrorAny()) {
  Object[] obj = mediat.getErrorsAny();
  for(int i=0; i< obj.length; i++) {
   System.out.println("Errore nel caricamento dell'immagine numero " + i
     + "\n  --> " + ((Image)obj[i]) );
  }
 } else {
  imageReady = true;
 }
 repaint();
 while(true) {
  try {
   Thread.sleep(SLEEP_TIME);
   repaint();
  } catch(InterruptedException e) { }
 }
}
/**
 * Ridefinito per evitare il flickering.
*/
public void update(Graphics g) { paint(g); }
/**
 * E' diviso in 2 fasi: se le immagini non sono ancora disponibili
visualizza
 * un messaggio all'utente, altimenti cicla le immagini.
*/
public void paint(Graphics graph) {
 if (offscreen == null)
  getBackBuffer();
 Graphics g = offscreen.getGraphics();
 if(!imageReady) {
  Dimension dim = getSize();
  FontMetrics fm = Toolkit.getDefaultToolkit().getFontMetrics(getFont());
  int strlen = fm.stringWidth(WAIT_STR);
  g.drawString( WAIT_STR, (dim.width-strlen)/2, dim.height/2);
 } else {
  // se arrivo qui ho le immagini.
  g.setColor(Color.white);
  g.fillRect(0,0, getSize().width, getSize().height);
  if ((++count) >= numfiles)
   count = 0;
  showStatus("Immagine " + count + " di " + numfiles + ".");
  boolean ok = g.drawImage(images[count], 0, 0, null);
 }
 // in ogni caso blitto il back-buffer...
 graph.drawImage(offscreen, 0, 0, null);
}
/**
 * Serve per impostare il backBuffer.
 * @return Nulla.
*/
protected void getBackBuffer() {
 int w = getSize().width;
 int h = getSize().height;
 offscreen = createImage(w,h);
}
/**
 * Mostra, dopo aver determinato che tipo di oggetto sia lo statusBar,
 * il testo passato.
 * @param msg La java.lang.String da visualizzare
 * @return Nulla.
 * @see java.lang.String
*/
private void showStatus(String msg) {
 if (statusBar == null) // non voglio sprecare la CPU!!!
  return;
 if (statusBar instanceof Label) {
  ((Label)statusBar).setText(msg);
  return;
 }
 if (statusBar instanceof TextField) {
  ((TextField)statusBar).setText(msg);
  return;
 }
 if (statusBar instanceof TextArea) {
  ((TextArea)statusBar).append(msg);
  return;
 }
 if (statusBar instanceof Applet) {
  ((Applet)statusBar).showStatus(msg);
  return;
 }
}
/**
 * Metodo da superare in una sottoclasse per eseguire comandi diversi
 * a seconda del numero dell'immagine cliccata dall'utente.
 * Nella mia implementazione dimostrativa non fa altro che
 * stampare su System.out il numero di immagine cliccata :-)
 * @see java.awt.Component
 * @see java.awt.Event
*/
public boolean mouseDown(Event e, int x, int y) {
 // In questo metodo puoi fare di tutto... persino aprire una
 // finestra del browser: tanto hai il riferimento all'applet!!!
 // io mi limito a stampare il numero dell'immagine cliccata...
 System.out.println("Cliccata immagine " + count + ".");
 showStatus("Cliccata immagine " + count + ".");
 return super.mouseDown(e, x, y);
}
}
Salutoni MindFlavor.