|
| Hvorfor kan jeg ikke se mine ikoner? Fra : Janus |
Dato : 26-05-06 17:42 |
|
Hej NG!
Jeg har et projekt i Eclipse, hvor jeg i min GUI forsøger at benytte mig
af ikoner fra jlfgr-1_0.jar filen. Biblioteksstrukturen er som følger:
MyProject
start
etc
I package etc ligger jlfgr-1_0.jar.
I package start ligger så Start.java, hvori jeg forsøger at gøre følgende:
JMenuItem menuItemAbout = new JMenuItem("About", new
ImageIcon("toolbarButtonGraphics/general/About16.gif"));
I Eclipse er jar-filen både med i Classpath og Source. (Create, manage
and run applications).
Meeen ... det virker ik'. Er det fordi man ikke kan tilgå andet end
deciderede javafiler i en .jar, eller er det bare mig, der mangler en
pointer til den jar-fil et sted? Har prøvet at rykke rundt på jar-filen,
men det hjælper heller ikke...
Pft,
Janus
| |
Niels Dybdahl (31-05-2006)
| Kommentar Fra : Niels Dybdahl |
Dato : 31-05-06 08:07 |
|
> Meeen ... det virker ik'. Er det fordi man ikke kan tilgå andet end
> deciderede javafiler i en .jar, eller er det bare mig, der mangler en
> pointer til den jar-fil et sted? Har prøvet at rykke rundt på jar-filen,
> men det hjælper heller ikke...
Jeg plejer at loade billeder fra Jarfilen ved hjælp af:
Toolkit toolkit = Toolkit.getDefaultToolkit();
URL imgURL=parent.getClass().getResource("images/"+iconFilename);
if (imgURL==null || imgURL.getFile()==null || imgURL.getFile()=="")
throw new FormattedException(...);
Image image = toolkit.getImage(imgURL);
Billederne er i dette tilfælde placeret i en undermappe ("images") i forhold
til en eller anden klasse (parent).
Niels Dybdahl
| |
Janus (31-05-2006)
| Kommentar Fra : Janus |
Dato : 31-05-06 16:03 |
|
Hej Niels.
Dit forslag må jeg lige prøve på et tidspunkt :)
Mit spørgsmål kan også tolkes som af mere generel karakter: Når man i
sin classpath har en jar-fil, som indeholder klassefiler, kan man blot
tilgå disse ved deres navn, så som mypackageinjar.subpackage.MyClass.
Men hvis jar-filen indeholder ikke-java materiel så som billeder, skal
man åbenbart behandle dem anderledes, i Niels' eksempel som en datakilde
der skal tilgås via ToolKit.
Hvordan kan det være?
Vh Janus
Niels Dybdahl wrote:
> Jeg plejer at loade billeder fra Jarfilen ved hjælp af:
>
> Toolkit toolkit = Toolkit.getDefaultToolkit();
> URL imgURL=parent.getClass().getResource("images/"+iconFilename);
> if (imgURL==null || imgURL.getFile()==null || imgURL.getFile()=="")
> throw new FormattedException(...);
> Image image = toolkit.getImage(imgURL);
>
| |
Johnnie Hougaard Nie~ (31-05-2006)
| Kommentar Fra : Johnnie Hougaard Nie~ |
Dato : 31-05-06 19:59 |
|
Janus wrote:
> Men hvis jar-filen indeholder ikke-java materiel så som billeder, skal
> man åbenbart behandle dem anderledes, i Niels' eksempel som en datakilde
> der skal tilgås via ToolKit.
Nej, ikke-class filer i en jar skal ikke behandles via Toolkit. Kernen
er at du f.eks kan:
InputStream is = getClass().getResourceAsStream("/resources/" + fn) ;
Eller
URL resource = getClass().getResource("/resources/" + fn) ;
Tingene bliver dog mere komplicerede hvis du har behov for en anden
classloader end den som har loaded den kaldende klasse. Men så længe
klasser og resource-filer ligger i samme jar, plejer det at gå nemt.
Skråstregen i starten af mine eksempel navne giver søgning i roden af
classpath; uden skråstreg søges der i eller under den aktuelle pakke.
/Johnnie
| |
Janus (07-06-2006)
| Kommentar Fra : Janus |
Dato : 07-06-06 16:11 |
|
Johnnie Hougaard Nielsen wrote:
> Janus wrote:
>> Men hvis jar-filen indeholder ikke-java materiel så som billeder, skal
>> man åbenbart behandle dem anderledes, i Niels' eksempel som en
>> datakilde der skal tilgås via ToolKit.
>
> Nej, ikke-class filer i en jar skal ikke behandles via Toolkit. Kernen
> er at du f.eks kan:
> InputStream is = getClass().getResourceAsStream("/resources/" + fn) ;
> Eller
> URL resource = getClass().getResource("/resources/" + fn) ;
Okay, men for at få tilgang til dem, skal de stadig behandles
"anderledes" end Class-filer, hvis tilgangsmetode er, som lå de ikke i
en Jar-fil?
Eksempelvis:
Jeg laver en MyJar.jar og lægger 2 filer i den: HelloWorld.class og
flower.GIF. Herefter hæfter jeg MyJar.jar til min classpath.
I mit program kan jeg nu tilgå ressourcen HelloWorld.class ved at
skrive: HelloWorld hw = new HelloWorld();
Men jeg kan ikke tilgå ressourcen flower.GIF på samme simple måde:
JMenuItem menu = new JMenuItem("Pretty", new ImageIcon("flower.GIF"));
Er det korrekt? Og i så fald, skal jeg så gøre noget lignende dette:
JMenuItem menu = new JMenuItem("Pretty", new
ImageIcon(getClass().getResource("flower.GIF")));
(Jeg kan ikke afprøve det på dette tidspunkt, derfor spørgsmålet)
Mvh Janus
| |
Johnnie Hougaard Nie~ (07-06-2006)
| Kommentar Fra : Johnnie Hougaard Nie~ |
Dato : 07-06-06 23:59 |
|
Janus wrote:
> Okay, men for at få tilgang til dem, skal de stadig behandles
> "anderledes" end Class-filer, hvis tilgangsmetode er, som lå de ikke i
> en Jar-fil?
Tjah, forskellen er såmænd ikke så stor endda. ImageIcon arbejder
grundlæggende på URL objekter, og constructor'en med String kan egentlig
betegnes som en convenience constructor, der (i princippet) laver et
filnavn om til en URL, i stedet for at du selv gør det.
Og ja, der er jo forskel på hvordan et URL objekt instantieres, afhængig
af hvor data ligger. En classpath søgning er noget andet end at henvende
sig direkte til filsystemet. Sånt er livet.
Men det med at lave en URL har INTET specielt med jar filer at gøre; det
kører ligeså godt alligevel, så længe at image filen er tilgængelig på
classpath.
I øvrigt ser jeg at ImageIcon internt bruger Toolkit til at tage fat i
image filen.
> Er det korrekt? Og i så fald, skal jeg så gøre noget lignende dette:
>
> JMenuItem menu = new JMenuItem("Pretty", new
> ImageIcon(getClass().getResource("flower.GIF")));
Jeg vil gætte på at det virker; som skrevet også selv om du ikke jar'er
din runtime. Men Swing er det lykkedes mig at holde mig fra
| |
Janus (08-06-2006)
| Kommentar Fra : Janus |
Dato : 08-06-06 08:39 |
|
Johnnie Hougaard Nielsen wrote:
> Og ja, der er jo forskel på hvordan et URL objekt instantieres, afhængig
> af hvor data ligger. En classpath søgning er noget andet end at henvende
> sig direkte til filsystemet. Sånt er livet.
Ah, i så fald vil det ikke være helt forkert at tolke class path'en som
JRE'ens lokale filsystem?
> Men det med at lave en URL har INTET specielt med jar filer at gøre; det
> kører ligeså godt alligevel, så længe at image filen er tilgængelig på
> classpath.
Jæs jæs, den er jeg med på :) Jeg har bare haft opfattelsen, at JAR
filers indhold på run time tidspunktet automatisk blev "pakket ud",
hvorfor det i så fald skulle virke at tilgå flower.GIF uden at bruge
getResource(). Nu er jeg blevet så meget klogere, mange tak for hjælpen!
Slutteligt kan jeg da lige tilføje, at jeg har prøvet med getResource()
nu, og det virker!
Med venlig hilsen Janus
| |
Thorbjørn Ravn Ander~ (08-06-2006)
| Kommentar Fra : Thorbjørn Ravn Ander~ |
Dato : 08-06-06 09:28 |
|
Janus <invalid@invalid.dk> writes:
> Ah, i så fald vil det ikke være helt forkert at tolke class path'en
> som JRE'ens lokale filsystem?
Sådan kan man vælge at se på det. Classpath er der hvor
standardclassloaderen kigger efter ting, og resourcer indlæses via
classpath.
> Jæs jæs, den er jeg med på :) Jeg har bare haft opfattelsen, at JAR
> filers indhold på run time tidspunktet automatisk blev "pakket ud",
Nøp.
--
Thorbjørn Ravn Andersen
| |
Johnnie Hougaard Nie~ (08-06-2006)
| Kommentar Fra : Johnnie Hougaard Nie~ |
Dato : 08-06-06 09:57 |
|
Janus wrote:
> Ah, i så fald vil det ikke være helt forkert at tolke class path'en som
> JRE'ens lokale filsystem?
Den analogi kan et stykke vej fungere. Når tingene bliver mindre end
simple bryder den sammen, og det vil være mere rigtigt at sige at
en classpath kan hente fra et af operativsystemets filsystemer, men kan
en del mere end et filsystem.
Forskellen begynder at markere sig ifm flere classloadere, sikkerhed og
de finurligheder som kan styres via jar manifest filer. Visse måder at
køre en jar-pakket applikation på vil aktivt adskille denne fra hvad der
ligger uden for jar filen, som f.eks. classpath system property.
Et typisk eksempel er "java -jar myappl.jar".
| |
|
|