IDEA IntelliJ Bilder in der fertigen Application

Galliad

Mitglied
Ich stecke aktuell in der Entwicklung eines kleinen Behelfsprogramms. Das Programm generiert ein paar kleine Werte, die zum Teil in Bildern ausgedrückt werden. Ich habe wirklich viele Bilder drin, über 70 Stück. Bisher habe ich Code im folgenden Format verwendet um die Bilder zu integrieren:

[CODE lang="java" title="Image Icon"]climateImageLabel.setIcon(new ImageIcon("D:\\Dropbox\\Codingprojekte\\Wildnistool\\src\\DSA_Wildnistool\\Pictures\\KEIN BILD.jpg"));[/CODE]

Den Pfad habe ich direkt von Inteliji aus dem Dateimanager links heraus kopiert. Ich habe dabei zur Sicherheit immer den Absolute Path, der von C:\\ ausgeht verwendet.
Nun wurde ich gebeten, eine vorab Version an einen Bekannten zu schicken. Ich habe dazu ein paar Tutorials angeschaut und dann in der Projektstruktur, das Projekt filehinzugefügt .
Bilderladen 1.PNG
Bilderladen 2.PNG

Hier seht ihr meine Projektstruktur.
Ihr seht außerdem, dass der Pfad immer "null" ist, was ich nicht ganz nachvollziehen kann.
Ich habe es mit folgenden Codes versucht:
[CODE lang="java" title="Meine Versuche:"]//1
climateImageLabel.setIcon(new ImageIcon(getClass().getResource("src/DSA_Wildnistool/Pictures/KEIN BILD.jpg")));

//2
climateImageLabel.setIcon(new ImageIcon(ImageIO.read("src/DSA_Wildnistool/Pictures/KEIN BILD.jpg")));

//3
climateImageLabel.setIcon(new ImageIcon(getClass().getResourceAsStream("src/DSA_Wildnistool/Pictures/KEIN BILD.jpg")));

//4
climateImageLabel.setIcon(new ImageIcon(new File("src/DSA_Wildnistool/Pictures/KEIN BILD.jpg")));[/CODE]

Das sind zumindest die, die mir einfallen, ich habe gestern die halbe Nacht lang versucht das Problem zu lösen. Leider führt alles dazu, dass der Pfad entweder null ist, oder wenn er es nicht ist, dass in der fertig gerenderten Application die Bilder fehlen.
Kann mir bitte jemand dabei helfen meine Applikation aufzusetzen? Ich weis nicht mal mehr ob das Problem der Code, die Projektstruktur oder Inteliji selbst ist.
 
climateImageLabel.setIcon(new ImageIcon(getClass().getResource("src/DSA_Wildnistool/Pictures/KEIN BILD.jpg")));
Das wäre schon der richtige Weg, den ClassLoader zu verwenden. Allerdings lädt der ClassLoader natürlich aus dem ClassPath und da kommt src nicht vor. Schau einfach mal in das jar-File (das ist einfach ein ZIP-File), wo dort die Bilder liegen und den Pfad gibst Du dann an (sollte /DSA_Wildnistool/... sein).
 
Das wäre schon der richtige Weg, den ClassLoader zu verwenden. Allerdings lädt der ClassLoader natürlich aus dem ClassPath und da kommt src nicht vor. Schau einfach mal in das jar-File (das ist einfach ein ZIP-File), wo dort die Bilder liegen und den Pfad gibst Du dann an (sollte /DSA_Wildnistool/... sein).
hey. Ich habe den ClassLoader auch schon versucht, der hat auch nicht geklappt.
Aber ich weiß nicht genau, was du mit ClassPath meinst, oder welches jar-File. Ich habe die Bilder raw im Projektordner liegen.
 
Probier einfach mal:

Java:
climateImageLabel.setIcon(new ImageIcon(getClass().getResource("/DSA_Wildnistool/Pictures/KEIN BILD.jpg")));

Erklärung reiche ich nach.
 
Das Problem hört leider bei dem einen Bild nicht auf. Ich habe ein Reihe von Bildern, die ich über einen Array organisere.
Ich habe eine Klasse angelegt, namens climate, darin gibt es den Array climateSelection und den Array climatePictures.
Es existiert eine JComboBox. Der Code ist so angelegt, dass immer, wenn die Auswahl der Box geändert wird, folgender Code ausgeführt wird.


Java:
selectedClimate = new climate();
            String moodpic = selectedClimate.climatePictures[climateSelection.getSelectedIndex()];
            climateImageLabel.setIcon(new ImageIcon(getClass().getResource(moodpic)));

Der Array ist ein Array mit Strings, also ein String[]. Der Code, den du mir gegeben hast, funktioniert perfekt. Sogar im fertigen Build. Aber die Bilder aus dem Array nicht. Auch wenn ich den URL da genau hineinkopiere.
 
Was ist denn dann für ein Wert in moodpic und welches Bild soll geladen werden?

Wenn der Pfad und der Name richtig sind, dann wird das Bild auch geladen.
 
Erstmal zur Erklärung: die JVM lädt Klassen und Ressourcen aus dem Class-Path mit Hilfe eines ClassLoaders. Der Class-Path wird beim Start der Anwendung angegeben und enthält Bibliotheken, URLs, Verzeichnisse, die für den ClassLoader als Ausgangspunkt der Suche gelten.

Die IDE verwenden ein Build-System (entweder ein eigenes, internes oder ein externes wie Ant, Maven oder Gradle). Beim Build werden Klassen und Ressourcen in einen definierten Verzeichnisbaum gespeichert (einen Hinweis darauf liefert im Bilderladen 2.PNG das Feld Output Directory). Dieser Verzeichnisbaum wird bei der Ausführung von der IDE als Teil des Class-Path angegeben. Geht der Build einen Schritt weiter, wird ein Jar-File erzeugt. Im Wesentlichen wird dabei der Verzeichnisbaum gezippt und dem Zip ein Manifest hinzufügt, das ggf. Angaben zum Class-Path sowie zur ausfzuführenden Klasse etc. enthält. So ist es dann möglich, das Jar weiterzugeben, das bereits die Bilder enthält.

Und nachdem @kneitzel schon geschrieben hat, kann ich mir die Fragen sparen 🙂 Außerdem kennt sich @kneitzel bestens in IntelliJ aus und kann Dir zu den Einstellungen mehr erzählen, weil ich in der Regel mit NetBeans unterwegs bin.
 

Zurück
Oben