JavaFX PNG aus einem resource Ordner laden

friednoodles

Aktives Mitglied
Hallo,
mein Problem ist wie folgt:
Ich habe mir einen resource Ordner angelegt in meinem Eclipse Projekt und habe dort eine Datei "cc.png" liegen. Diese habe ich mit folgenden Zeilen versucht als TrayIcon zu laden:
Java:
 String icon = "/resources/cc.png";
Java:
            SystemTray tray = SystemTray.getSystemTray();
            URL iconpath = new URL (icon);
            Image image = ImageIO.read(iconpath);
            TrayIcon trayIcon = new TrayIcon(image);
Java:
 tray.add(trayIcon);
Der Fehler der beim Ausführen des Programms dann ausgegeben wird ist folgender
Java:
java.net.MalformedURLException: no protocol: /resources/cc.png
    at java.net.URL.<init>(Unknown Source)
    at java.net.URL.<init>(Unknown Source)
    at java.net.URL.<init>(Unknown Source)
    at application.Konverter.addAppToTray(Konverter.java:134)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

Zeile 134 ist
Java:
 URL iconpath = new URL (icon);

Ich habe daraus den Schluss gezogen mein String wird nicht richtig geparsed. Stimmt das? Wenn ja, was muss ich ändern?
Danke schon mal für mögliche Hinweise! 🙂
 
Den ressource Ordner solltest du zum Build-Path hinzufügen dann kannst du das Bild über folgenden Aufruf laden
Java:
getClass().getClassLoader().getRessourceAsStream("cc.png");
 
Das funktioniert nur, wenn die Dateien direkt im Dateisystem liegen, nicht wenn es als jar/war/whatever gepackt ist.
Und grad ganz vergessen: ... und das Programm von der richtigen Stelle aus gestartet wird.

Die png liegt bei mir direkt im Ordner resources neben src, bin und .settings
Ist das nicht empfehlenswert?
Doch, natürlich, die müssen ja irgendwo liegen.

Allerdings packt man Java-Programme üblicherweise als jar, welche alles zur Ausführung nötige enthält. Die Bilder liegen dann nicht mehr direkt im Dateisystem, sondern innerhalb der jar, wo sie nur mit @Robats Varianten ladbar sind. Abgesehen davon ist es immer Schöner Stil, zum Programm gehörende Resourcen auch als solche zu laden 🙂
 
Wenn du willst, dass es auch per jar geht, kannst du es so machen:
Java:
Image image = ImageIO.read(getClass().getResource("resource/cc.png"));
Bisher befinden sich die Bilder in einem Ordner. Hier müssen sie sich in einem package namens mypackage.resource befinden (falls deine Java-Datei in mypackage liegt).
 

Zurück
Oben