[Java] Icons für JMenuItem

Laz-Y

Lieutenant
🎅Rätsel-Elite ’18
Registriert
Feb. 2007
Beiträge
616
IDE: Eclipse 3.2 Java: 5.0

Ich habe ein Problem mit der Swingoberfläche. Da ich vorher noch nie was mit Swing gemacht habe und die Oberfläche nur einen geringen Umfang hat mach ich das alles von Hand, benutze also keine Drag&Drop Lösungen zur Oberflächengestaltung.

Ich will einem JMenuItem ein Icon verpassen. Wenn ich dem JMenuItem ein Bild vom Typ ImageIcon mittels Konstruktor übergebe funktioniert das auch wunderbar und die Bilder werden angezeigt. Jedenfalls solange ich das Programm (mit Swingoberfläche) über Ecipse starte.
Wenn ich das Projekt aber als jar exportiere und ausführe habe ich im Programm keine Bilder mehr.

Woran liegt das? Habt Ihr ne Idee?
 
Wenn du das Icon nur per relativer Pfad-Angabe ladest, muss der Pfad innerhalb eines Class-Path sein. Also entweder in der System-Variable Class-Path das Verzeichnis eintragen oder beim Aufruf der Anwendung über den Parameter -cp das Verzeichnis hinzufügen.

Andernfalls mit Tricks den absoluten Pfad-Namen zur Laufzeit herausfinden oder in einer Config-Datei zB speichern.
 
Danke für Deine Hilfe!

Die beste Lösung wäre sicherlich den Pfadnamen zur Laufzeit herauszufinden. Wie ist das möglich?
 
String iconPath = "/com/package/graphics/youricon.png"; //Beispiel Pfad
ImageIcon icon = new ImageIcon(getClass().getClassLoader().getResource(iconPath); //Immer mit ClassLoader laden.
JMenuItem menuItem = new JMenuItem(icon);

So funktioniert es sowohl in der IDE (Eclipse) als auch im *.jar

Falls Du noch Probleme hast, einfach nochmal melden.

Gruß
Ebola
 
Geht aus welchem Grund auch immer bei mir nicht. Wenn ich aus
Code:
String iconPath = "/com/package/graphics/youricon.png";
Code:
String iconPath = "./com/package/graphics/youricon.png";
mache dann gehts zumindest in Eclipse. (Der Unterschied ist der Punkt zuBeginn). Allerdings bekomme ich mit einer *.jar gar keinebilder zu sehen. Genauso ohne Punkt.
Kann mir nicht erklären worans liegt. :confused_alt:
 
Hast du schonmal in dein .jar geschaut, ob die Icons auch mit reinexportiert wurden?
 
Hier der Codeausschnitt:
Code:
String urlBeenden = "/apps/zahlenumrechner/cross.png";
ImageIcon iconBeenden = new ImageIcon(getClass().getClassLoader().getResource(urlBeenden));
itemBeenden = new JMenuItem("Beenden", iconBeenden);

Ich hatte die Bilder als erstes in einem extra Verzeichnis images. Ich habe zu Testzwecke das Bild in apps.zahlenumrechner verschoben. Wie gesagt funktioniert dies nur, wenn ich vor den Pfad einen Punkt schreibe. Allerdings gilt dies nur für Eclipse.

Ohne kommt folgender Fehler:
Code:
Exception in thread "main" java.lang.NullPointerException
	at javax.swing.ImageIcon.<init>(Unknown Source)
	at apps.zahlenumrechner.view.UmrechnungsGUI.<init>(UmrechnungsGUI.java:100)
	at apps.zahlenumrechner.MainGUI.main(MainGUI.java:13)

Zur Veranschaulichung die Verzeichnisstruktur als Bild.
 

Anhänge

  • Bild2.png
    Bild2.png
    12,1 KB · Aufrufe: 490
Also ich habe das mal so gelöst:
Code:
Config c = new Config();
String codebase = java.net.URLDecoder.decode(c.getClass().getResource("..").getPath());
Wobei Config ist einfach eine Konfigurations-Klasse in meinem Package. Solltest du irgendeine Klasse von dir rein schreiben.

Der Resultat ist der Pfad zur Anwendung. Wobei ich so vorgegangen bin, dass die Grafiken in einem extra Verzeichnis liegen (also nicht ins Jar eingebunden).
 
Ich hab nun eine Lösung gefunden. Wenn ich bei "/apps/zahlenumrechner/cross.png" das erste / weglasse (apps/zahlenumrechner/cross.png) gehts sowohl unter Eclipse als auch als *.jar.
Ich werds mal auf verschiedenen Systemen testen ob dies auch dort läuft.

Danke nochmals für Eure Hilfe, besonders an Ebola.
 
Zuletzt bearbeitet:
@Loopo
werde ich auf jedenfall auch ausprobieren !
Vielleicht ist die Vorgehensweise besser. Mal sehen. Besonderen Dank auch Dir
 
Laz-Y schrieb:
Ich hab nun eine Lösung gefunden. Wenn ich bei "/apps/zahlenumrechner/cross.png" das erste / weglasse (apps/zahlenumrechner/cross.png) gehts sowohl unter Eclipse als auch als *.jar.

Sorry das hatte ich vergessen zu erwähnen:
- Bei externen Verzeichnissen muss das vorangestellte Slash weggelassen werden.
- Bei internen (in der package-Struktur) muss es vorangestellt werden.

Es empfiehlt sich meistens alle Ressourcen zu der Anwendung intern abzulegen, damit das *.jar später nichts vermissen kann.

Solltest Du das jar per Ant Skript erstellen, achte darauf das die *.png (oder welche Endung die Bilder auch immer haben) inkludiert wird.
Beispiel: <fileset dir="." includes="**/*.png"/>

Gruß
Ebola
 

Ähnliche Themen

Antworten
9
Aufrufe
1.286
Zurück
Oben