[Java]

[Java] - Programmation

Marsh Posté le 15-04-2001 à 22:14:10    

Voila, j'ai une application ( pas une applet )
Elle charge des images. ( style getImage("test.gif" ) )
 
Ca se passe tres bien si j'execute le .class dans le repertoire ou il se trouve (et ou se trouve la gif)
Par contre, si je l'execute depuis un autre repertoire, ca ne vas pas -> Comment trouver le path dans lequel se trouve la class ?
 
Et si j'en fait un jar ca ne marche pas non plus -> Comment faire pour qu'il aille cherche l'image dans le jar ?
 
Merci

Reply

Marsh Posté le 15-04-2001 à 22:14:10   

Reply

Marsh Posté le 16-04-2001 à 22:34:31    

Tout simplement parce que le package ou elle se trouve fait partie de son nom. Et il y a concordance parfaite entre packages Java et répertoires sur le disque.
 
Donc : si l'image est dans un autre répertoire, pour Java, elle est dans un autre package. En d'autre termes, il faut que tu donnes, avec le nom de l'image, son chemin par rapport à la "racine" de la hiérachie de tes classes.

Reply

Marsh Posté le 16-04-2001 à 23:12:59    

Je m'excuse 246tNt de m'incruster mais j'ai exactement le meme probleme que toi au niveau du chargement des images qui ne s'effectue pas alors qu'elles sont bien dans mon jar. Et mon appli ne les lit pas paske si je bouge mon jar elles ne s'affichent plus prouvant donc qu'ils les lit pas dans mon jar mais sur mon dur.
 
Je fais bien pourtant un :
 
jar cmf META-INF\MANIFEST.MF MONAPPLI.jar MESCLASSES\*.class icons\*.gif  
 
avec icons qui contient toutes mes images.
 
Je comprends pas comment une image(son nom en fait) peut faire partie d'un package aussi, puisque c'est juste un parametre dans un fonction.
 
BifaceMcLeOD, tu pourrais juste nous expliquer en prenant un exemple ca serait sympa.
 
Merci d'avance.

Reply

Marsh Posté le 17-04-2001 à 00:27:14    

Dans Java, une image ou un fichier de propriétés (.properties) sont gérés exactement de la même façon qu'une classe. Ce sont d'abord des fichiers. Et tous sont chargés en mémoire exactement de la même façon.
 
Après, ce qui est différent, c'est ce qu'on fait du contenu du fichier qui a été copié en mémoire.
 
Quand tu invoques une classe de n'importe où (sauf de son package), il faut que tu spécifies le package de cette classe. Cela va permettre à Java de trouver le fichier .class sur le disque.
Pour les images, c'est pareil. Comme veux-tu que Java invente que les images sont à chercher dans "../icons" ?
 
PS: Inutile de préciser que tu écris une application et non une applet, pour Java, il n'y a quasiment aucune différence ; en fait, seul le point d'entrée, c'est-à-dire la façon de démarrer, diffère. D'ailleurs, tu peux très facilement écrire une application qui se comporte comme une applet.

 

[edit]--Message édité par BifaceMcLeOD--[/edit]

Reply

Marsh Posté le 17-04-2001 à 16:58:45    

J'ai trouvé la solution, mes path était correct.
Voila mon code :
 
 String filename = new String("NP/toolbox/panel.jpg" );
 Toolkit tk = this.getToolkit();
 this.m_rawImg = tk.getImage( this.getClass().getClassLoader().getResource(filename) );

Reply

Marsh Posté le 17-04-2001 à 17:06:37    

je rajoute juste pour ceux qui ont des pb à récuperer des images contenues dans un JAR qu'il faut faire attention a la casse (majuscule/minuscule) car,si dans win il  s'en fout, il n'en est pas de meme dans un .jar !

Reply

Marsh Posté le 17-04-2001 à 20:22:18    

246tNt a écrit a écrit :

J'ai trouvé la solution, mes path était correct.
Voila mon code :
 
 String filename = new String("NP/toolbox/panel.jpg" );
 Toolkit tk = this.getToolkit();
 this.m_rawImg = tk.getImage( this.getClass().getClassLoader().getResource(filename) );




C'est bizarre que tu aies besoin de faire explicitement appel au loader de classe...
Il me semblait que le code suivant suffisait...
 
    String relativeFilename = "NP/toolbox/panel.jpg";
    this.m_rawImg = this.getToolkit().getImage(relativeFilename);

Reply

Marsh Posté le 17-04-2001 à 21:33:02    

J'ai essayé ca d'abord mais ca ne marche pas si il est dans un jar ou si on execute la classe a partir d'un autre emplacemement (style  java d:\Projet\Test  a partir du c: )

Reply

Marsh Posté le 17-04-2001 à 22:59:57    

Depuis un jar, ça m'étonne. Le code que j'utilise marche dans tous les cas (jar ou hiérarchie de classes, applet ou appli), ce que j'ai posté ne fait qu'élimier le cas applet.
 
A mon avis, tu as un problème de CLASSPATH et/ou de fabrication de ton JAR.

Reply

Marsh Posté le 18-04-2001 à 02:17:56    

Oui peut etre de CLASSPATH mais bon, avec le ClassLoader ca marche dans le java de sun ( ca fait planter le JView de microsoft mais bon ... )
 
Je regarderait ca plus tard si j'ai le temps ...

Reply

Marsh Posté le 18-04-2001 à 02:17:56   

Reply

Marsh Posté le 18-04-2001 à 02:20:30    

comment tu fait ton jar toi ?

Reply

Marsh Posté le 18-04-2001 à 03:36:28    

Ben avec "jar"...  :p  
 
Dans ton cas, ça marcherait sans doute si une fois le jar construit, ton image panel.jpg avait effectivement pour chemin "NP/toolbox/panel.jpg" (ouvre le jar avec WinZip pour pouvoir voir ça).
 
Pour info, ma fonction de chargement d'image complète est la suivante (on suppose que la classe courante étend java.applet.Applet, ce qui peut toujours être le cas, même pour une application) :
 
import java.awt.Image;
import java.awt.Toolkit;
import java.net.URL;
 
public Image loadImage(String relativeFileName) {
    try {
        URL  codeBase = this.getCodeBase();
 
        return this.getImage(codeBase, relativeFileName);
    }
    catch (NullPointerException e) {
        // Raised if the applet is run as an application
        //  => there is no URL code base
        return Toolkit.getDefaultToolkit().getImage(relativeFileName);
    }
}
 
Et garanti, elle marche bien...

 

[edit]--Message édité par BifaceMcLeOD--[/edit]

Reply

Marsh Posté le 18-04-2001 à 08:43:20    

Ben ouai mais je peut pas etendre applet vu que j'etend déja Panel ...
 
Parce que dans mon jar, le path relatif est bon...
( je le fait avec visual J++, activer l'empaquetage )

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed