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

avec Java Discussion :

Soucis avec les ressources


Sujet :

avec Java

  1. #1
    Membre émérite
    Avatar de polymorphisme
    Homme Profil pro
    Publishing
    Inscrit en
    Octobre 2009
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Publishing
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Points : 2 371
    Points
    2 371
    Par défaut [Résolu] Soucis avec les ressources
    Bonsoir,

    j'essaie d'intéger des ressources dans une archive jar.
    J'ai fait un paquetage org.applications.calculette puis
    j'ai mis mes ressources dans les repertoires :
    org/applications/calculette/resources/images et
    org/applications/calculette/resources/fonts

    Pour les images, j'utilise :
    URL urlImageZero = getClass().getResource("/resources/images/imgZero.gif");
    puis
    button[i]=new JButton(buttonNom[i],new ImageIcon(buttonImage[i]));
    et ca marche nickel.

    En lisant la FAQ, j'ai voulu bien faire avec la fonte et j'ai crée cette classe :
    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
    private Font setResourceFont(String fileName) {
            Font font;
            FileInputStream ttf = null;
            String pathFileName = new String(getClass().getResource("/resources/fonts/" + fileName + ".ttf").toString());       
            try {
                ttf = new FileInputStream(pathFileName);
                font = Font.createFont(Font.TRUETYPE_FONT, ttf);
                return new Font(font.getFamily(), Font.BOLD, 24);
            } catch (FileNotFoundException ex) {            
                System.out.println("FileNotFoundException");
            } catch (FontFormatException ex) {           
                  System.out.println("FontFormatException");
            } catch (IOException ex) {            
                  System.out.println("IOException");
            } finally {
                try { ttf.close(); }
                catch (Exception ignore) {}          
                font = new Font("Serif", Font.BOLD, 22);
                return font;
            }
        }
    puis j'utilise setResourceFont("Lucida_Calligraphy_Italic");
    mais java me lève une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    java.io.FileNotFoundException: file:\C:\Users\greg\Documents\NetBeansProjects\Calculette\build\classes\resources\fonts\Lucida_Calligraphy_Italic.ttf (Syntaxe du nom de fichier, de répertoire ou de volume incorrecte)
            at java.io.FileInputStream.open(Native Method)
    que je ne comprends pas parce que mon fichier Lucida_Calligraphy_Italic.ttf est à la bonne place il me semble. Merci de votre aide
    Article : Installation de Cocoon
    Je ne réponds pas aux MP à caractère technique.

  2. #2
    Membre actif Avatar de Roy Miro
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 273
    Points : 290
    Points
    290
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String pathFileName = new String(getClass().getResource("/resources/fonts/" + fileName + ".ttf").toString());
    Bonjour,

    As-tu essayé de retirer le slash mis en rouge? Si oui, ça a le même effet?

  3. #3
    Membre émérite
    Avatar de polymorphisme
    Homme Profil pro
    Publishing
    Inscrit en
    Octobre 2009
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Publishing
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Points : 2 371
    Points
    2 371
    Par défaut Test sans slash
    Bonjour,

    j'ai testé a tout hasard, mais c'est pire, j'essuie une exception :
    Exception in thread "main" java.lang.NullPointerException
    Et l'application ne se lance même plus .

    En fait, je suis pas vraiment étonner, parce que je pense que la JVM va rechercher le répertoire org/applications/calculetteresources/fonts
    et ne le trouve donc pas puisqu'il n'existe pas
    Article : Installation de Cocoon
    Je ne réponds pas aux MP à caractère technique.

  4. #4
    Membre actif Avatar de Roy Miro
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 273
    Points : 290
    Points
    290
    Par défaut
    Essaie d'introduire quelque part dans ton code, avant que ça plante,:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(System.getProperty("user.dir"));
    Cette instruction sert à afficher le répertoire de travail courant. En connaissant le répertoire considéré comme "courant" par l'exécution de ton programme, tu peux essayer d'indiquer un chemin à partir de ce répertoire vers ton fichier.

  5. #5
    Membre émérite
    Avatar de polymorphisme
    Homme Profil pro
    Publishing
    Inscrit en
    Octobre 2009
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Publishing
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Points : 2 371
    Points
    2 371
    Par défaut En creusant un peu
    Bonjour,

    en testant, je me suis rendu compte que :

    String pathFileName = new String(getClass().getResource("/resources/fonts/" + fileName + ".ttf").toString());
    ttf = new FileInputStream(pathFileName);
    ne fonctionne pas.

    En revanche, lorsque je remplace pathFileName par la chaîne "C:/Users/greg/Documents/NetBeansProjects/Calculette/src/org/polymorphisme/calculator/resources/fonts/" + fileName + ".ttf", la méthode FileInputStream fonctionne.

    Pour tenter de comprendre, j'ai fait un System.out.println(pathFileName ) :
    file:/C:/Users/greg/Documents/NetBeansProjects/Calculator/build/classes/org/polymorphisme/calculator/resources/fonts/fontLucidaCalligraphyItalic.ttf

    Pour résoudre le soucis, j'ai tronqué ma chaîne pathFileName :
    pathFileName = pathFileName.substring(6,pathFileName.length());

    Finalement cel afonctionne, mais n'existe t-il pas un moyen plus "propre" pour arriver au même résultat.

    Merci pour vos idées.
    Article : Installation de Cocoon
    Je ne réponds pas aux MP à caractère technique.

  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
    Salut,


    Pour commencer ton code est très critiquable :
    • Ton finally avec l'exception ignoré est potentiellement dangereux. De même il serait préférable d'éviter le try/catch/finally qui peut être casse-gueule et préférer un [b]try/finally dans un [b]try/catch.
    • Ton return dans un bloc finally est encore pire : il prendra TOUJOURS le dessus l'autre return de ton code...
      Un bloc finally ne doit jamais contenir de return (d'ailleurs le compilateur te met un warning là dessus).
    • Enfin tes manipulations sur l'URL de la ressource sont en effet ultra-spécifique de l'emplacement exact de ta ressource.
      Ainsi si tu packages tout cela en JAR cela ne marchera plus.
      Tu n'as pas à utiliser FileInputStream ! Tu peux utiliser la méthode URL#openStream() ou tout simplement getResourceAsStream()...


    Ton code devrais plutôt se rapprocher de quelque chose comme ceci :
    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
    	private Font setResourceFont2(String fileName) {
    		try {
    			InputStream ttf = getClass().getResourceAsStream("/resources/fonts/" + fileName + ".ttf");
    			try {
    				Font font = Font.createFont(Font.TRUETYPE_FONT, ttf);
    				return font.deriveFont(Font.BOLD, 24);
    			} finally {
    				ttf.close();
    			}
    		} catch (FontFormatException ex) {
    			System.out.println("FontFormatException");
    		} catch (IOException ex) {
    			System.out.println("IOException");
    		}
    		return new Font("Serif", Font.BOLD, 22);
    	}
    a++

  7. #7
    Membre émérite
    Avatar de polymorphisme
    Homme Profil pro
    Publishing
    Inscrit en
    Octobre 2009
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Publishing
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Points : 2 371
    Points
    2 371
    Par défaut [Resolu] Enfin une solution :)
    J'apprends quelque chose, c'est déjà pas mal : Ton finally avec l'exception ignoré est potentiellement dangereux. De même il serait préférable d'éviter le try/catch/finally qui peut être casse-gueule et préférer un [b]try/finally dans un [b]try/catch

    Je m'en étais rendu compte, mais je n'avais de solution : Ton return dans un bloc finally est encore pire : il prendra TOUJOURS le dessus l'autre return de ton code...

    Je confirme pour avoir tester : Enfin tes manipulations sur l'URL de la ressource sont en effet ultra-spécifique de l'emplacement exact de ta ressource. Ainsi si tu packages tout cela en JAR cela ne marchera plus.

    J'ai cru bien faire : dans la faq http://java.developpez.com/faq/java/...policeTrueType, on peut lire :
    "depuis le système de fichiers :
    ttf = new FileInputStream("/aaa/bbb/ccc/ARIALN.TTF");"
    Peut-être un manque d'habitude de ma part.

    Bref, finalement, en supprimant le premier caractère slash dans le chemin du fichier de la fonte, la méthodes fonctionne très bien .

    Je l'écris des fois que cela puisse resservir ! Merci beaucoup

    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
     
    private Font setResourceFont(String fileName) {
    		try {
    			InputStream ttf = getClass().getResourceAsStream("resources/fonts/" + fileName + ".ttf");
    			try {
    				Font font = Font.createFont(Font.TRUETYPE_FONT, ttf);
    				return font.deriveFont(Font.BOLD, 24);
    			} finally {
    				ttf.close();
    			}
    		} catch (FontFormatException ex) {
    			System.out.println("FontFormatException");
    		} catch (IOException ex) {
    			System.out.println("IOException");
    		}
    		return new Font("Serif", Font.BOLD, 22);
    	}
    Article : Installation de Cocoon
    Je ne réponds pas aux MP à caractère technique.

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

Discussions similaires

  1. [Dates] souci avec les dates
    Par Ludo75 dans le forum Langage
    Réponses: 3
    Dernier message: 22/02/2006, 17h15
  2. Soucis avec les JTables et les listener
    Par shingo dans le forum Composants
    Réponses: 2
    Dernier message: 22/02/2006, 11h51
  3. Soucis avec les Graphiques dans les états
    Par Chococrocq dans le forum IHM
    Réponses: 27
    Dernier message: 04/01/2006, 19h03
  4. petit soucis avec les listes
    Par Death83 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 03/09/2005, 10h08
  5. Réponses: 7
    Dernier message: 05/10/2004, 13h44

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