[Java / image] fout bij weergeven van image uit JAR file

Pagina: 1
Acties:
  • 188 views sinds 30-01-2008
  • Reageer

  • Black Hawk
  • Registratie: Oktober 2003
  • Laatst online: 21-05 15:09
Hallo allemaal, ik loop tegen het volgende probleem aan: het weergeven van afbeelingen in een (executable) JAR-file resulteert tot de volgende melding:
code:
1
2
3
4
5
6
7
8
9
10
11
An unexpected exception has been detected in native code outside the VM.
Unexpected Signal : EXCEPTION_ACCESS_VIOLATION occurred at PC=0x6D2835EB
Function=JNI_OnLoad+0x249
Library=C:\Program Files\jvm\bin\jpeg.dll

Current Java thread:
    at sun.awt.image.JPEGImageDecoder.readImage(Native Method)
    at sun.awt.image.JPEGImageDecoder.produceImage(JPEGImageDecoder.java:144)
    at sun.awt.image.InputStreamImageSource.doFetch(InputStreamImageSource.java:257)
    at sun.awt.image.ImageFetcher.fetchloop(ImageFetcher.java:168)
    at sun.awt.image.ImageFetcher.run(ImageFetcher.java:136)


Na veel rondgezocht te hebben kwam ik hier uit: [rml][ JAVA] image laden met relatief pad[/rml] maar dat heeft me weinig verder geholpen.

Hieronder mijn code
Java:
1
2
3
4
5
6
7
8
9
10
11
try {
  plaatje = Toolkit.getDefaultToolkit().getImage(GUIController.class.getResource(s)); 
}
catch (Exception e) { System.err.println("Fout bij laden plaatje");}
            
tracker = new MediaTracker(this); 
tracker.addImage(plaatje,0);            
try {
  tracker.waitForAll(); 
} 
catch(InterruptedException ie){}             
(De naam GUIController spreekt voor zich)
Dit werkt allemaal perfect, zolang ik het run vanuit JBuilder (X). Maar ik wel er een Application (= JAR) van maken en dan gaat het fout. Als ik dan de JAR ga runnen krijg ik bovenstaande foutmelding. Ik heb alle tips/probeersels uitgeprobeert uit bovenstaande link, maar daarmee kom ik niks verder.

Wie kan me op weg helpen om een image vanuit een JAR-file te kunnen laden?

Wie nooit tijd heeft, kan er niet mee omgaan.


  • Macros
  • Registratie: Februari 2000
  • Laatst online: 30-04 09:28

Macros

I'm watching...

Jammer genoeg voor de programmeur is het in Java niet hetzelfde om een file van de hd of het web, of uit een Jar, of uit een Jar als het een WebStart app is te halen. Elke methode heeft een andere manier jammer genoeg.

"Beauty is the ultimate defence against complexity." David Gelernter


  • Black Hawk
  • Registratie: Oktober 2003
  • Laatst online: 21-05 15:09
Daar was ik al achter :(
Maar heb jij dan een oplossing misschien?

Wie nooit tijd heeft, kan er niet mee omgaan.


  • Macros
  • Registratie: Februari 2000
  • Laatst online: 30-04 09:28

Macros

I'm watching...

Ik had hetzelfde met simpele text files. Mijn oplossing zal ik dus posten, misschien kan je zelf een eigen versie maken dan.
Java:
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
33
    public static String readTextFromJar(String s) {
        try {
            InputStream is = ClassLoader.getSystemResourceAsStream(s);
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String line;
            StringBuffer buffer = new StringBuffer();
            while ((line = br.readLine()) != null) {
                buffer.append(line);
                buffer.append("<br>");
            }
            return buffer.toString();
        } catch (Exception e) {
            return "";
        }
    }
    
    public static String readTextFromFilesystem(String file){
        try {
            FileReader r = new FileReader(file);
            LineNumberReader lnr = new LineNumberReader(r);
            String line;
            StringBuffer buffer = new StringBuffer();
            while((line = lnr.readLine()) != null){
                buffer.append(line);
                buffer.append("<br>");
            }
            String aboutText = buffer.toString();
            return aboutText;
        } catch (FileNotFoundException e) {
        } catch (IOException e) {
        }
        return "";
    }

Als ik dus met de ene methode "" terug kreeg, dan probeerde ik de andere methode. Lukte dat ook niet, dan gebruikte ik een default string (wat dus gebeurde in een WebStart app, zucht).

"Beauty is the ultimate defence against complexity." David Gelernter


  • Black Hawk
  • Registratie: Oktober 2003
  • Laatst online: 21-05 15:09
Macros iig bedankt voor je code, maar ik heb er niet zoveel aan. Alleen de het opvragen van het pad dmv ClassLoader heb ik kunnen gebruiken, maar ook dat werkt niet :(

Is er nog iemand die me verder kan helpen (met het lezen/ophalen van afbeeldingen (jpg) uit een jar file (ze bevinden zich in dezelfde jar file waar ook de classen etc instaan))

Wie nooit tijd heeft, kan er niet mee omgaan.


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 19:40

Robtimus

me Robtimus no like you

Binnenin http://www.stack.nl/~iceman/jxtv-0.6.jar zit in de root een plaatje dat wordt afgebeeld als Icon.

De code ervoor:
Java:
1
2
3
4
5
        URL icon = getClass().getResource("/Iceman.jpg");
        if (icon != null)
        {
            setIconImage(new ImageIcon(icon).getImage());
        }
icon != null want hij wordt afgebeeld.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • djengizz
  • Registratie: Februari 2004
  • Niet online
Heb je al iets geprobeerd als file:images/image.gif ?

[ Voor 60% gewijzigd door djengizz op 29-09-2004 18:31 ]


  • Black Hawk
  • Registratie: Oktober 2003
  • Laatst online: 21-05 15:09
Het lukt mij niet om een plaatje weer te geven dmv de statement file:images/image.gif ik krijg dan al een error tijdens het compileren

Met de methode van IceManX kan ik ook niet zoveel mee, want het gaat fout op het moment van het ophalen van het plaatje, niet bij het weergeven.

Wie nooit tijd heeft, kan er niet mee omgaan.


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 19:40

Robtimus

me Robtimus no like you

Maar op die manier wordt het zowel opgehaald (getClass().getResource("/Image.jpg");) als afgebeeld (setIconImage(new ImageIcon(icon).getImage());)

Dat ophalen werkt hier bij 2 programma's uitstekend, allebei in een JAR file. Gebruik je die / op het begin wel? Als het ware een absoluut pad binnenin die JAR.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • TukkerTweaker
  • Registratie: November 2001
  • Laatst online: 19-05 16:06
Gebruik de code van IceManX, die werkt hier ook perfect (zelfs zonder de voorgaande slash).
Heb je wel gecontrolleerd of het bewuste plaatje wel in je jar file staat?

  • Black Hawk
  • Registratie: Oktober 2003
  • Laatst online: 21-05 15:09
TukkerTweaker schreef op 04 oktober 2004 @ 14:02:
Gebruik de code van IceManX, die werkt hier ook perfect (zelfs zonder de voorgaande slash).
Heb je wel gecontrolleerd of het bewuste plaatje wel in je jar file staat?
Ja, zelfs op de goede plaats ! :)

Verder heb ik het volgende geprobeerd:
- plaatje inladen, maar niet weergeven
- plaatje inladen en wel weergeven

In JBuilder werkt dit perfect, maar via de executable Jar niet. Daar 'struikelt' hij over het inladen van het plaatje met de volgende code:
Java:
1
2
3
4
5
6
7
8
9
10
11
try {
plaatje = Toolkit.getDefaultToolkit().getImage(TekenPaneel.class.getResource("/" + s));
- of - 
plaatje = Toolkit.getDefaultToolkit().getImage(TekenPaneel.class.getResource(s));
- of - 
plaatje = Toolkit.getDefaultToolkit().getImage(getClass.getResource("/" + s));
- of- 
plaatje = Toolkit.getDefaultToolkit().getImage(getClass.getResource(s));
// s = "images/achtergrondMainMenu.jpg"
}
catch (Exception e) { System.err.println("Fout bij laden plaatje"); }


Is er nog een andere manier om een afbeelding weer te geven?
Ik heb als OS windows xp, werkt 'ie misschien anders met paden in een JAR?

En ik heb ook ergens wat gelezen over absolute paden dat'ie met een '.' (punt) aangegeven worden, is dat zo? en zo ja, moet ik dan de '/' vervangen door een '.'?

Wie nooit tijd heeft, kan er niet mee omgaan.


  • Macros
  • Registratie: Februari 2000
  • Laatst online: 30-04 09:28

Macros

I'm watching...

Ik heb deze code in mijn project:
Java:
1
2
3
4
5
6
7
8
9
10
11
    public static ImageIcon createImageFromJar(String path, String description) {
        try {
            InputStream is = ClassLoader.getSystemResourceAsStream(path);
            BufferedImage image = ImageIO.read(is);
            return new ImageIcon(image, description);
            
        } catch (Exception e) {
            System.err.println("Couldn't find file: " + path);
            return null;
        }
    }

"Beauty is the ultimate defence against complexity." David Gelernter

Pagina: 1