begin process at 2010 02 10 06:08:59
  Trouver un code source :
 
dans
 
Accueil > Forum > 

JAVA / J2EE / J2ME

 > 

Divers

 > 

Débutant(e)

 > 

Préchargement d'image


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Préchargement d'image

mardi 26 août 2008 à 23:14:12 | Préchargement d'image

Nitruk

Bonjour, j'ai aujourd'hui une vraie question de vrai débutant à poser :

Y  a-t-il un moyen de précharcher une image, et de ne rendre la main au programme qu'une fois que c'est fait ? Car j'utilise des panneaux dont la méthode paintComponant affiche une petite image, dont l'objet correspondant a été créé dans le constructeur.
Or ces images ont tendance (environ une fois sur deux) à ne pas toutes apparaître à l'apparition de la fenêtre, mais à le faire si je la rabats et l'aggrandis (repaint, avec l'intervalle pour finir de charger). J'ai cru comprendre que le constructeur de ImageIcon chargeait complètement avant d erendre la main et que le getImage d eToolkit chargeait en arrière plan, avant de comprende l'inverse. En tout cas, j'ai tuilisé ces 2 méthodes sans remarquer de différence, et j'ai même essayer de faire une boucle avec ImageIcon :

    icone = new ImageIcon(getClass().getClassLoader().getResource(add));
    for(int i = 1; icone.getImageLoadStatus() != MediaTracker.COMPLETE; i++)
      {
   System.out.println(Integer.toString(icone.getImageLoadStatus()));
   i--;
   }

Ma fenêtre n'apparaissait pas, et en ajoutant le println  j'ai compris que le LoadStatus restait bloqué à 2 et n'avançait pas tant que durait la boucle, qui je suppose ne devait pas laisser de temps pour charger l'image en arrière plan.
Un LoadStatus d e2 correspond à l'état ABORTED, or les images apparaissent bien avec un repaint() tardif (Pas la peine d'appeler repaint^après l'apparition de la fenêtre, c'est sans effet)

Nitruk
mardi 26 août 2008 à 23:58:25 | Re : Préchargement d'image

Twinuts

Membre Club Administrateur CodeS-SourceS

Salut,

fait plutôt ça :

ImageIcon icon = new ImageIcon(...);
icon.getImage(); // pour t'assurer que l'image est bien chargée
//exploitation de l'objet ImageIcon


------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
mercredi 27 août 2008 à 14:38:14 | Re : Préchargement d'image

Nitruk

Merci, mais j'utilise déjà getImage(), étant de toute façon obligé d'employer un objet Image pour des fonctions comme
drawImage(Image img, int x, int y, ImageObserver observer)
Nitruk
mercredi 27 août 2008 à 14:48:40 | Re : Préchargement d'image

Twinuts

Membre Club Administrateur CodeS-SourceS
Salut,

oui mais faiT le une première fois avant de l'utiliser dans la méthode drawImage, comme ça tu n'attendras pas *ce* moment là pour charger complètement l'image.




------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
mercredi 27 août 2008 à 14:54:24 | Re : Préchargement d'image

Nitruk

Erci encore mais je viens de le faire et ça ne change rien, d'ailleurs  le chargement commence bien avant puisque ma boucle m'envoyait des 8
(COMPLETE) avant de bloquer sur des 2 (ABORTED).

Nitruk
mercredi 27 août 2008 à 15:21:47 | Re : Préchargement d'image

Twinuts

Membre Club Administrateur CodeS-SourceS
Salut,

oui mais la solution que je te propose ne doit pas avoir ta boucle ...

tien voici 3 exemples pour charger un image (exemple pour un SplashScreen) :

exemple 1 : Utilisation de ImageIcon et la méthode getImage
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;


public class Test extends JFrame {
   
    public Test() {
        setDefaultCloseOperation(3);
       
        //chargement de l'image
        ImageIcon icon = new ImageIcon("img.png");
        icon.getImage();
        // creation d'un label pour l'image
        JLabel content = new JLabel();
        content.setIcon(icon);
        //ajout du label à la fenetre
        setContentPane(content);

        pack();
        setLocationRelativeTo(null);
    }
   
    public static void main(String[] args) {
        new Test().setVisible(true);
    }

}

exemple 2 : Utilisation de ImageIcon et de la méthode read de l'objet ImageIO
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;


public class Test extends JFrame {
   
    public Test() {
        setDefaultCloseOperation(3);
       
        //chargement de l'image
        BufferedImage img = null;
        try {
            img = ImageIO.read(new File("img.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        ImageIcon icon = new ImageIcon(img);
        icon.getImage();
        // creation d'un label pour l'image
        JLabel content = new JLabel();
        content.setIcon(icon);
        //ajout du label à la fenetre
        setContentPane(content);

        pack();
        setLocationRelativeTo(null);
    }
   
    public static void main(String[] args) {
        new Test().setVisible(true);
    }

}

exemple 3 : Utilisation de Image et d'un MediaTracker

import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;


public class Test extends JFrame {
   
    public Test() {
        setDefaultCloseOperation(3);
       
        //chargement de l'image
        Image img = Toolkit.getDefaultToolkit().createImage("img.png");
        MediaTracker mt = new MediaTracker(this);
        mt.addImage(img, 0);
        try {
            mt.waitForAll();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
       
        // creation d'un label pour l'image
        JLabel content = new JLabel();
        content.setIcon(new ImageIcon(img));
        //ajout du label à la fenetre
        setContentPane(content);

        pack();
        setLocationRelativeTo(null);
    }
   
    public static void main(String[] args) {
        new Test().setVisible(true);
    }

}

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
mercredi 27 août 2008 à 15:53:37 | Re : Préchargement d'image

Nitruk

La première solution est celle que j'utilisais jusque là, la deuxième fonctionne sans problème, sauf que je ne peux pas utiliser getClass().getClassLoader().getResource(add) (La méthode toString() me renvoie une adresse absolue de type file:/d:/Java/image.gif qui déclenche cette erreur quand elle est soumise au constructeur de File  :

javax.imageio.IIOException: Can't read input file!
        at javax.imageio.ImageIO.read(ImageIO.java:1275)
        at clientFen$1PanneauIcone.<init>(clientFen.java:273
        at clientFen.<init>(clientFen.java:311)
        at Client.main(Client.java:16)
Exception in thread "main" java.lang.NullPointerException
        at javax.swing.ImageIcon.<init>(ImageIcon.java:161)
        at clientFen$1PanneauIcone.<init>(clientFen.java:277
        at clientFen.<init>(clientFen.java:311)
        at Client.main(Client.java:16)

Or mon programme prenant place dans un jar, j'ai besoin d'ne apsser par là. Je vais donc essayer la 3ème solution de ce pas.

Nitruk
mercredi 27 août 2008 à 16:07:34 | Re : Préchargement d'image

Nitruk

Je suis encore passé à deux doigts d'y arriver : Si le constructeur de File n'accepte aps ce type d'adresses, celui d'URI s'en accomode très bien, et on peut construire un File à partir d'un URI.
... Sauf que dans un jar, ma classe se met à émettre une erreur :

Exception in thread "main" java.lang.IllegalArgumentException: URI is not hierarchical
        at java.io.File.<init>(File.java:363)
        at clientFen$1PanneauIcone.<init>(clientFen.java:272)
        at clientFen.<init>(clientFen.java:331)
        at Client.main(Client.java:16)

Nitruk
mercredi 27 août 2008 à 16:32:42 | Re : Préchargement d'image

Twinuts

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !
Salut,

tu peux toujours essayer avec la méthode 'getResourceAsStream'
si non utiliser la classe ResourceLocator dispo ICI (2ème message)

bien que normalement tu ne devrais pas avoir de problèmes (je n'ai pas le même problème en local avec une image dans le jar)...


------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
mercredi 27 août 2008 à 16:46:38 | Re : Préchargement d'image

Nitruk

La 3ème solution donne le même résultat que la première, ce qui n'est aps surprenant, puisque le constructeur d'ImageIcon utilise le Media Tracker, donc en théorie devrait attendre d'avoir fini de charger l'image avant de rendre la main.
Je conclus donc à un bug du tracker, ce qui m'avance bien, avec URI qui ne fonctionne pas dans un jar..
Si quelqu'un a une meilleure idée, je serais ravi de l'entendre.
Merci d'avance

Nitruk

1 2

Cette discussion est classée dans : icone, image, fenêtre, repaint, imageicon


Répondre à ce message

Sujets en rapport avec ce message

scintillement image de fond [ par Juls ] BonjourJe rencontre un problème de scintillement d'une image de fond (image.jpeg) . Le prog redessine un objet mobile (voiture simulée par un cercle ) Un ImageIcon dans une des colonnes d'un JTable [ par bibe ] Bonjour à tous.J'ai un JTable, dans une des colonnes de celui-ci, je voudrai afficher une image.Mais voila, j'ai bientôt plus de cheuveux sur la tête. PBS ANIMATIONS THREADS [ par Geomaster ] Voilà mon probleme.--------------------------------------------------------------------this.y -= 10;image = "Perso_Dos_2.gif";panneau.repaint();try { java bean [ par mailkeul ] Bonjour,Je dois créer un bean pour un projet.Malheureusement j'ai quelques soucis pour démarrer.Mon bean ressemblerai à un icone avec une image, et ce redimenssionner une imageIcon dans un JLabel [ par eio ] SalutJessaie de redimensionner une ImageIcon dans un JLabel. L'original de l'image(un drapeau) est beaucoup trop grande donc je veux réduire l'image p Zone de saisie image et icone ... [ par lamoufle ] Bonjour j'aimerai réaliser une zone de saisie permettant a l'utilisateur de saisir un texte et d'inserer des icones (style msn messenger) mais je ne s bouton avec une icone (ou image) dans une applet [ par srodrigues ] bonjour à tous, Après de nombreuses recherches je n'ai toujours pas trouver une solution à mon probleme. C'est pour ca que je vous demande de l'aide. Lancement d'une fenêtre contenant une image [ par Bandit_world ] Je suis novice en java et j'ai développé une application graphique. Lors de l'appui sur un bouton je souhaite qu'une frame se lance par dessus mon int problème image [ par grenatdu55 ] salut !! voila j'ai un problème : je n'arrive pas à afficher une image dans un onglet pourtant j'ai l'impression de faire ce qu' il faut Code: ImageI Pb de setBounds() [ par joduak ] Bonjour! J'ai un petit souci dans mon développement... Je souhaite afficher plusieurs fois la même image dans ma fenêtre. Pour l'afficher j'utilise


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,452 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales