Newsgroup: it.comp.java
Titolo: Difficolta col metodo drawImage()

Hi difficolta a far disegnare una immagine su di un JPanel..
sicuramente sara' una boiata ma non riesco a capire dove sbaglio,
eppure il rettangolo lo disegna ma l'img no.
Ecco il codice del frame:
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
public class Splash extends JFrame {
  TPanel p = new TPanel();
  public Splash() {
    this.getContentPane().setLayout(new BorderLayout());
    this.getContentPane().add(p,BorderLayout.CENTER);
    this.setLocation(0,0);
    this.setSize(400,400);
    this.setVisible(true);
  }
  public static void main(String[] a) {
    new Splash();
  }
}
class TPanel extends JPanel{
  Image img = Toolkit.getDefaultToolkit().getImage("sfera.gif");
  public void paint(Graphics g) {
    g.drawImage(img,0,0,this);
    g.drawRect(10,10,100,100);
  }
}

Ho scoperto che era il file dell'imagine non corretto...

Potresti dirmi esattamente cos'è che non ti piace/va?
A prima vista posso dirti :
1 - se vuoi fare uno SplashScreen devi estendere Window, altrimenti ti
comparirà la barra della finestra con relativo bordo e bottoni.
2 - Per disegnare su un JPanel, o + in generale su gli oggetti derivati da
JComponent, devi utilizzare il metodo : paintComponent(Graphics g) piuttosto
che paint(Graphics g).
A parte il nome leggermente differente, il modo d'uso è lo stesso, solo che
è obbligatorio mettere come prima istruzione la chiamata al paintComponent
della classe padre.
es :
class ImagePanel extends JPanel
{
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        // codice per disegnare
    }
}
3 Hai commesso il tipico errore di chi lavora per la prima volta con le
immagini su Java.
Le immagini non è che vengono caricate all'istante. Il fatto che tu riceva
dal metodo getImage, un'istanza di tipo Image, non è detto che questa
contenga l'immagine, anzi, se la tratti a quella maniera, al 99% non ce
l'hai.
Le immagini vengono caricate in maniera asincrona, quindi anche se tu ricevi
un'istanza, quella magari viene valorizzata dopo un tot di tempo e te ne
accorgi solo se per sbaglio iconizzi l'applicazione e poi la ridimensioni.
Per ovviare a questo problema devi usare MediaTracker.
Questo oggetto si occupa di verificare che l'immagine sia stata caricata
completamente.
Questa politica è dovuta dal fatto che spesso le immagini non sono
riperibili all'istante. Prendi il caso di un Apllet.
Ecco come devi modificare il tuo oggetto:
public class ImagePanel extends JPanel
{
    private Image img;
    public ImagePanel()
    {
        super();
        // In questo punto tu hai solo un'istanza.
        // Oltretutto, anche se metti un path o un nome sbagliato
        // ti torna comunque un istanza valida. Per verificare
        // Se l'immagine è valida, devi vedere se le sue
        // dimensioni sono diverse da -1.
        img = Toolkit.getDefaultToolkit().getImage("sfera.gif");
        // Ora istanzio un MediaTracker
        // Che poi estende un ImageObserver se non ricordo male.
        MediaTracker mt = new MediaTracker();
        // passo l'immagine al M.T. dandogli un id, questo perché posso
anche decidere
        // di verificare il caricamento solo di un'immagine in particolare.
        mt.add(img,0);
        try{
            // Ora aspetto che vengano caricate correttamente le immagini.
            mt.waitForAll();
        }catch(InterruptedException e){}
    }
}
Ora i vari elementi ce li hai. Buon lavoro.
Ciao.