1 2 3 4 5 6 7 8 9 10 11
|
...
try {
Image image =Toolkit.getDefaultToolkit().getImage("Image/galaxie.jpg");
super.paintComponent(g);
g.drawImage(image, 0, 0, PTotalSimul.getWidth(), PTotalSimul.getHeight(), null);
}
catch (Exception e) {
e.printStackTrace();
}
... |
Une premiere remarque, avant de commencer : la methode paintComponent est un tres mauvais endroit pour creer ton image. Il vaut mieux par exemple faire une classe SimulPanel avec une methode d'init.
Maintenant, ton probleme. Que se passe-t-il lorsque la ligne suivante est executée la première fois:
Image image =Toolkit.getDefaultToolkit().getImage("Image/galaxie.jpg");
Tu crée un objet qui représente l'image, associé au fichier Image/galaxie.jpg. Mais l'image n'est pas décompressée. Elle n'a pas de représentation en mémoire, mais simplement la liste des informations nécessaires pour le faire.
Lorsque la ligne suivante s'execute la première fois :
g.drawImage(image, 0, 0, PTotalSimul.getWidth(), PTotalSimul.getHeight(), null);
L'image n'étant pas décompressée, la methode demarre la decompression, et retourne de suite (cf la javadoc), et donc n'affiche rien.
Lorsque plus tard tu repasses par cette methode, l'image est décompressée, et donc drawImage t'affiche l'image.
Pour le resoudre, tu peux :
1. mettre ton composant en temps qu'observer en le passant en parametre de la methode drawImage(). Un java.awt.Component est par defaut un ImageObserver, qui lorsque l'image est completement chargée appelle repaint().
le code devient
g.drawImage(image, 0, 0, PTotalSimul.getWidth(), PTotalSimul.getHeight(), this);
2. Faire la decompression avant, dans la methode d'init par exemple. Soit en utilisant un java.awt.MediaTracker. Soit via javax.imageio.ImageIO.read();
Enfin, si ton image est opaque, et recouvre entièrement ton panel, pas besoin de faire de super.paintComponent().
Partager