IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Eclipse Java Discussion :

[Info] Conseils pour gérer les ressources


Sujet :

Eclipse Java

  1. #1
    Membre confirmé Avatar de calogerogigante
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    602
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 602
    Points : 497
    Points
    497
    Par défaut [Info] Conseils pour gérer les ressources
    Bonjour,

    Après avoir programmé une longue période sous JGrasp pour faire mes premières armes en java, je redécouvre aujourd'hui avec plaisir l'éditeur Eclipse.

    J'ai une petite question à poser concernant la façon de gérer les ressources (images, musiques, fichiers texte de données,...) :

    Un exemple : j'ai un bouton swing qui a besoin d'une image située dans un folder nommé "images" dans le folder du projet.

    Sans devoir obligatoirement importer au sein du projet ce folder "images", lors de l'exécution, je vois que le bouton s'affiche correctement.
    Cela dit, je vois qu'on peut "officiellement" importer le folder dans le projet... Il s'affiche alors dans la vue package.

    Est-ce mieux de faire ainsi (càd d'importer au sein de projet) ?



    [Modéré par Didier] : ajout de tag dans le titre - Les règles du forum Java

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut Re: Conseils pour gérer les ressources
    Salut,

    Citation Envoyé par calogerogigante
    Cela dit, je vois qu'on peut "officiellement" importer le folder dans le projet... Il s'affiche alors dans la vue package.
    Que veux-tu dire exactement par "importer" ? le répertoire image ne fait pas partie de ton projet ???




    Pour moi l'accès aux ressources dépend de la manière dont tu souhaites y accéder :
    • Soit il s'agit de fichiers externe à ton application, et dans ce cas tu les places où tu veux dans ton arborescence et tu y accèdes via les méthodes de gestion de fichier.
    • Soit il s'agit de fichier interne qui seront placé à l'intérieur du jar, et dans ce cas les fichiers doivent se situer dans le Classpath et tu y accèdes via getClass().getResource().


    a++

  3. #3
    Membre confirmé Avatar de calogerogigante
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    602
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 602
    Points : 497
    Points
    497
    Par défaut
    Disons que mon répertoire "images", quand je le crée manuellement via Windows Explorer, n'apparait pas dans l'arborescence package d'Eclipse (ce qui me semble anormal par rapport à JGrasp qui, lui, le faisait automatiquement...).

    L'image est néanmoins correctement affichée dans mon bouton.

    Cela dit, mon souci futur est de bien m'assurer que l'image du bouton sera bien inclue dans le jar du programme fini.

    Voilà. C'est pour ça que je pense qu'il faille importer le folder "images"...

    Mais peut-être que je me gourre complètement dans la procédure la plus adaptée ???

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par calogerogigante
    Disons que mon répertoire "image", quand je le crée manuellement via Windows Explorer, n'apparait pas dans l'arborescence package d'Eclipse (ce qui me semble anormal par rapport à JGrasp qui, lui, le faisait automatiquement...).
    Ok eclise gère lui-même les fichiers du projet, et ne vérifie pas si des fichiers/répertoires ont été créés. Il faut faire un refresh sur le projet (F5) pour le forcer à revérifier tout...

    Citation Envoyé par calogerogigante
    L'image est néanmoins correctement affichée dans mon bouton.
    Comment tu ouvres ton images ?

    Citation Envoyé par calogerogigante
    Cela dit, mon souci futur est de bien m'assurer que l'image du bouton sera bien inclue dans le jar du programme fini.
    Si tu ouvres tes images de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new ImageIcon("images/fichier.png");
    Cela marche dans eclipse parce que le programme est lancé depuis le répertoire de base du projet, et qu'il trouve bien le répertoire images.
    Mais cela ne merchera pas une fois que tu auras créés un Jar, car il continuera de chercher le répertoire images dans le répertoire de travail de ton application (= le répertoire depuis lequel tu l'as lancé), sans regarder dans le Jar (ImageIcon(String) attend le nom d'un fichier et non pas le nom d'une ressource dans un fichier Jar).




    Pour avoir un comportement identique dans eclipse et dans ton Jar, il faut que tes ressources soient dans un package du classpath et accessible comme tes classes, afin d'optenir une URL vers ces fichiers avec getResource() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new ImageIcon(getClass().getResource("/images/fichier.png"));
    Le "/" au début du nom de la ressource est important : sinon la recherche se fera par rapport au répertoire du package de la classe appellante.


    a++

  5. #5
    Membre confirmé Avatar de calogerogigante
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    602
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 602
    Points : 497
    Points
    497
    Par défaut
    Oui, c'est exactement comme ça que mon petit exemple "récupère" l'image affichée dans le bouton...

    Donc, si je comprends bien ton explication (très claire :-) !!), dans ta dernière formulation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new ImageIcon(getClass().getResource("/images/fichier.png"));
    /images/ fait référence à un package nommé images ?

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par calogerogigante
    /images/ fait référence à un package nommé images ?
    Oui,

    Et getResource() te renvoit une URL du style file://chemin_complet/images/fichier.png lorsque tu le lance depuis eclipse (puisque le fichier est dans un simple répertoire), ou bien un truc du style jar:file://chemin_vers_le_ficher.jar!/images/fichier.png lorsqu'il est dans le jar.

    Et lorsque tu utilises la méthode openStream() sur cette URL, tu accèdes directement au contenu du fichier où qu'il se trouve (c'est ce que fait ImageIcon(URL)).


    Maintenant si tu fais (sans le / initial) depuis une classe nommé "com.societe.MaClasse" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new ImageIcon(getClass().getResource("images/fichier.png"));
    C'est équivalent à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new ImageIcon(getClass().getResource("/com/societe/images/fichier.png"));
    a++

  7. #7
    Membre confirmé Avatar de calogerogigante
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    602
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 602
    Points : 497
    Points
    497
    Par défaut
    C'est parfait Adiguba, un grand merci pour tes explications !!

    J'ai fait un package images (qu'il ne faut même pas importer ???) où je me suis empressé d'allé mettre une petite image en png. (en effet, le F5 suffisait pour rafraichir : quel idiot je fais, parfois...)

    Ensuite, j'ai testé ce petit code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    package testons;
     
    import java.awt.*;
    import javax.swing.*;
     
     
    class Test_002 extends JFrame
    {
        private static final long serialVersionUID = 1L;
     
        public JButton but;
     
        final int width  = 300;
        final int height = 200;
     
        public Test_002 ()
        {
        Icon ima = new ImageIcon( getClass().getResource("/images/une_image.png") );
        but = new JButton("Hello",ima);
        setSize(width, height);
        setTitle("Simple fenêtre");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.add("South", but);
        }
     
        public static void main(String [] args)
        {
        Test_002 sf = new Test_002();
        sf.setVisible(true);
        }
    }
    Et quand j'exporte le jar, l'image est correctement inclue dedans et est affichée correctement aussi quand le jar est exécuté !!
    Quel bonheur !!
    Et quelle joie de pouvoir tout organiser rationnellement ainsi dans des packages judicieusement nommés...

    Cela résout mon inquiétude.
    Je vais faire comme tu viens de me conseiller pour ma nouvelle période de développement sous Eclipse.

    Merci beaucoup pour avoir pris du temps pour me répondre.
    ;-)

  8. #8
    Membre confirmé Avatar de calogerogigante
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    602
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 602
    Points : 497
    Points
    497
    Par défaut
    Si ce n'est pas abuser, j'ai encore deux petites questions supplémentaires :

    1) peut-on également inclure dans le jar un fichier texte contenant par exemple les settings de son programme, et ensuite "repêcher" ce fichier quand c'est nécessaire depuis l'application, en utilisant la méthode expliquée ci-dessus par Adiguba (getClass.getRessource("..."); ) ?

    2) si la réponse est oui à la question ci-dessus, dans le cas où le programme modifierait ce fichier texte, peut-on écrire directement dans le jar les modifications du fichier texte ?

  9. #9
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    1) Oui tu peux récupérer n'importe quel type de fichier en utilisant l'InputStream renvoyé par la méthode openStream() de la classe URL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    InputStream stream = null;
    try {
    	stream = getClass().getResource("/package/file.txt").openStream();
     
    	// lecture du fichier
     
    } finally {
    	if (stream!=null) {
    		stream.close();
    	}
    }

    2) Non. L'URL te permet seulement de lire les données, pas de les modifier.
    Si tu veux modifier un fichier dans le Jar il faut le faire manuellement via JarFile mais c'est assez fastidieux...
    Si c'est un fichier de configuration je te conseille plutôt de le sauvegarder dans un fichier. Ainsi au démarrage tu charge le fichier interne au jar, puis le fichier externe s'il existe écrasera les valeurs déjà définit.

    De plus cela facilitera la modification de ce dernier par les utilisateurs...

    a++

  10. #10
    Membre confirmé Avatar de calogerogigante
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    602
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 602
    Points : 497
    Points
    497
    Par défaut
    Comme d'hab !
    Adiguba = Limpidité, clarté, efficacité !

    Merci.
    ;-)

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 15
    Points : 14
    Points
    14
    Par défaut Merci.....
    Super j'avais le même problème.

    Il suffisait d'ajouter \ en tête du path de mon image
    pour la récupérer dans mon jar.


    Merci pour ces explications..... très claires !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 13
    Dernier message: 07/02/2007, 12h10
  2. Réponses: 4
    Dernier message: 20/08/2006, 16h20
  3. Réponses: 1
    Dernier message: 20/08/2006, 13h36
  4. Réponses: 5
    Dernier message: 25/07/2005, 10h17
  5. Méthode simple pour gérer les collisions
    Par Hyoga dans le forum OpenGL
    Réponses: 2
    Dernier message: 19/02/2005, 13h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo