Image interne a charger

cs_mouchimouchi Messages postés 14 Date d'inscription samedi 14 octobre 2006 Statut Membre Dernière intervention 4 juin 2008 - 3 avril 2008 à 12:33
cs_mouchimouchi Messages postés 14 Date d'inscription samedi 14 octobre 2006 Statut Membre Dernière intervention 4 juin 2008 - 4 avril 2008 à 17:46
    Hello,
Autant dire que je ne m'y connais pas trop, genre debutant a fond.

J'essaye d'utiliser une classe ImagePanel ... pour utiliser une image chargée comme un panel.
Et pour le constructeur il faut :
            public ImagePanel ( File fileImg , int x , int y , int width , int height )

Donc moi ca fait chier u niveau du file :
    J'ai essayer :
            File fImg = new File("img/fond.png");
            ImagePanel image = new ImagePanel(fImg, 0, 0, 800, 600);
    Ca me retourne une erreur de la classe ImagePanel : Fichier Invalide.

    Jme suis dit que ca vient de la classe et non elle est bonne, et donc ca viendrais de l'url et donc j'ai tester ca :
            String file = "/img/fond.png";
            File fImg = new File(getClass().getResource(file).toURI());
            ImagePanel image = new ImagePanel(fImg, 0, 0, 800, 600);
    Ca ne me fait rien comme erreur sauf lorsque je lance le .jar en ligne de commande, ca rends une Exception a n'y rien comprendre :
             Exception in Thread ...java... URI is not Hierachical : et des libreries java.

Bon en esperant que quelqu'un reponde
Merci
a pluss
   

14 réponses

Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
3 avril 2008 à 14:45
Salut:

Tout dépend de l'emplacement des resources (images, ...).

Normalement, lorsque tu utilises la méthode getResource() tu dois placer/mettre la resource en question à auprès de la classe.

C'est à dire: la classe et le dossier des ressources (s'il existe) doivent se situer dans un même niveau.

|---- ImagePanel.class
|
|----+ img
     |---- image.png
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
3 avril 2008 à 14:56
Salut:

Avec le code présent de ImagePanel tu es dans l'obligation de mettre toutes les images de ton projets dans le package où se localise la classe ImagePanel.

Si tu ne veux pas suivre cette démarche, et associer à chaque interface utilisateur son propre dossier de ressources, tu dois fournir un paramètre supplémentaire au constructeur de la classe ImagePanel de type Class, qui référe à la classe désirant utiliser une image de fond.

Package:

|----+ com
     |------+ util
     |      |-------- ImagePanel
     |
     |------+ view
            |-------- MyFrame
            |--------+ resources
                     |----------- bg.png

J'espère avoir était clair.
0
cs_mouchimouchi Messages postés 14 Date d'inscription samedi 14 octobre 2006 Statut Membre Dernière intervention 4 juin 2008
3 avril 2008 à 16:27
Heuheuheu
Je t'avouerai avoir compris partiellement.
merci quand meme.

Mais si j'ai bien compris il faut que toutes mes images soit dans un dosier bien precis ...
Je voulais utilisai cette classe dans l'optique d'utiliser le FileChooser, pour qu'un utilisateur choisisse son image et qu'elle s'affiche . Aveec un tas d'option propre au panel basic.

si tu a un ptit exemple d'application pour que je puisse voir comment faire

Merci
0
Twinuts Messages postés 5373 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 10 août 2022 110
3 avril 2008 à 16:50
Salut,

si tu veux charger une image qui se trouve dans le JAR ou tu veux charger une image depuis le disque dur ?

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

OoWORAoO
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_mouchimouchi Messages postés 14 Date d'inscription samedi 14 octobre 2006 Statut Membre Dernière intervention 4 juin 2008
3 avril 2008 à 17:08
Bin enfaite ...

il me faut les 2, a partir du dd et aussi dans le jar.
A partir du dd le chemin absolut me suffisé : c:\\moi\\toi\\img.png.
Mais a partir du jar j'ai bô essayé de mettre img/fond.png, et toutes les combinaisons possibles avec ca, ca me met "Can't read file input".
Cette erreur m'est retourner par la classe de DARKSIDIOUS.
(tres bonne classe je trouve ).

Voilou

ps : Ombitious peux-tu mieux expliquer ton 2eme poste avec la hierarchis tous ca tous ca ???
0
Steph115 Messages postés 163 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 3 février 2012
3 avril 2008 à 18:15
Bonjour,

Savez vous quels paramètres faut il rajouter dans ces lignes de codes pour utiliser un fichier interne au JAR :

String file = "/img/fond.png";
File fImg = new File(getClass().getResource(file).toURI());
ImagePanel image = new ImagePanel(fImg, 0, 0, 800, 600);

Comme l'a stiplué Ombitious_Developper :
Si tu ne veux pas suivre cette démarche, et associer à chaque interface utilisateur son propre dossier de ressources, tu dois fournir un paramètre supplémentaire au constructeur de la classe ImagePanel de type Class, qui référe à la classe désirant utiliser une image de fond.

Merci encore. ++ Nexus

Chaque problème a sa solution. S'il n'y a pas de solution c'est qu'il n'y a pas de problème.
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
4 avril 2008 à 09:29
Salut:

Franchement, je n'ai pas jetter un coup oeil sur la classe de DarkSidious, mais je pense qu'avec quelques modifications tu peux obtenir:

public class ImagePanel ... {
    public ImagePanel(Class clazz, int x, int y, int width, int height) {
       // Code
       // Tu changes la méthode "getClass()" par le nouveau paramètre clazz.
       File fImg = new File(clazz.getResource(file).toURI());

       // Autre code
    }
}

Dans la classe désirant avoir un fond:

public class DecoratedFrame extends JFrame {
    // Quelque part dans une méthode non statique
    ImagePanel imgPanel = new ImagePanel(getClass(), 0, 0,
                getWidth(), getHeight());
    // ou bien
    // ImagePanel imgPanel = new ImagePanel(DecoratedFrame.class,
    //                       0, 0, getWidth(), getHeight());
}
0
cs_mouchimouchi Messages postés 14 Date d'inscription samedi 14 octobre 2006 Statut Membre Dernière intervention 4 juin 2008
4 avril 2008 à 11:41
Hello,
Maintenant j'obtient :    not valid for images created with createImage(producer)

Voici mon code dans la classe principale :
        String chemin = "/img/Collines.jpg";
        String url = this.getClass().getResource(chemin).toString();
        ImageLoader loader = new ImageLoader(url);
        Image img = loader.loadImage();
        Graphics g = img.getGraphics();
        JImagePanel pipi = new JImagePanel(img);
        pipi.paintComponent(g);
      
        jPanel2.add(pipi);
        jPanel2.updateUI();

La classe JImagePanel est ici : ,    http://www.javafr.com/codes/JIMAGEPANEL-PANEL-AFFICHANT-IMAGES-REDIMENSIONNEES-AVEC-MEME-ASPECT_42125.aspx

La classe ImageLoader est là : ici,     http://www.javafr.com/infomsg_CHARGER-IMAGE-SUR-ACTIONPERFORMED_1052257.aspx

Lorsque je regarde avec winrar le fichier .jar, je vois bien que le dossier "img" est à la racine.
Alors bon dieu bon dieu pourquoi l'image ne s'affiche pas correctement dans mon panel ????????

Merci pour vos conseil les mecs ( surtout Ombitious )
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
4 avril 2008 à 12:01
Salut:

Est ce que ce message est apparu avec les nouvelles modifucations?
0
cs_mouchimouchi Messages postés 14 Date d'inscription samedi 14 octobre 2006 Statut Membre Dernière intervention 4 juin 2008
4 avril 2008 à 12:07
Oui effectivement.

Enfaite il n'y a aucun message d'erreur si je ne fait pas le :
            paintComponent();

meme si je le lance en ligne de commande. Mais pourtant tjs pas d'image dans mon panel je ne vois rien de plus.

Et puis, je n'ai tjs pas compris le changement que tu as opéré dans ImagePanel avec en parametre du constructeur une Class ...
0
cs_mouchimouchi Messages postés 14 Date d'inscription samedi 14 octobre 2006 Statut Membre Dernière intervention 4 juin 2008
4 avril 2008 à 12:14
Haa oui ...

    Est-ce vraiment utile d'utiliser la méthode paintComponent(),
    Si oui d'où sort le Graphics à mettre en parametre ???
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
4 avril 2008 à 13:37
Salut:

La méthode paintComponent est héritée de la classe JPanel.

J'ai fait un coup d'oeil sur la classe JImagePanel.

public Image getImage(Class calzz, String filename) {
    try {
        InputStream is = calzz.getResourceAsStream(filename);
           
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024* 4];
        while (true) {
            int n = is.read(buffer);
            if (n == -1) {
                break;
            }
            baos.write(buffer, 0, n);
        }
         baos.close();
         return Toolkit.getDefaultToolkit().createImage(baos.toByteArray());
    } catch (Throwable t) {
        return null;
    }
}

Maintenant, utilises le constructeur de JImagePanel qui prend en argument un Image:

public class MyFrame extends JFrame {
    // ...
    Image image = getImage(MyFrame.class, "img/bg.png");
    JImagePanel jip = new JImagePanel(img, ...);
   
    // Ajouter l'objet JImagePanel au contentPane
}

J'espère que ça résoud le problème.
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
4 avril 2008 à 13:38
Salut:

J'ai oublié de mette un petit teste pour savoir si l'image est non null.

N'oublies pas de faire.

Autre chose, le répertoire img/ est situé prés de la classe MyFrame.
0
cs_mouchimouchi Messages postés 14 Date d'inscription samedi 14 octobre 2006 Statut Membre Dernière intervention 4 juin 2008
4 avril 2008 à 17:46
Bon bon bon,

ça a pour résultat ... rien.
comme pour les autres d'ailleurs il doit y avoir une erreur plus haut je pense.
Il faudrait que j'ai un projet d'exemple. Genre une base de quelqu'un pour qui ça fonctionne.

Parce que là je commence a me poser des question sur mon projet entier.

Ex : j'ai fais afficher l'url d'un fichier interne par :
        String chemin = "/img/Collines.jpg";
        String url = this.getClass().getResource(chemin).toString();
        System.out.printnl(url);
Au début ça m'affichais l'URL dans le fichier .jar, et maintenant ça m'affiche le chemin "normal" sans passer par le .jar.

Pourrais-je vous quémander une base de projet sûr ?
0