# Eclipse: Projekt mit src ordner exportieren.



## VPChief (26. Jun 2020)

Hallo, 
ich habe in Eclipse ein Programm mit Bildern erstellt. Die Bilder habe ich so angeordnet:

Zum Einfügen der Bilder benutze ich diesen Code:

```
button5.setIcon(new ImageIcon("src\\textures\\untergrund tex\\tex2.png"));
```
Wenn ich das Projekt als Runabble Jar File exportiere, sind die Bilder weg.
Kann mir jemand sagen wie ich das verzeichniss mit Exportieren kann.

Vielen Dank schonmal für eure Antworten


----------



## kneitzel (26. Jun 2020)

Ressourcen lädt man in der Regel über den Classloader. Ein gängiger Weg ist etwas wie:
getClass().getResourceAsStream("/textures/......") so dass Du den passenden Stream direkt an den Konstruktor von ImageIcon gibst.

Dabei ist wichtig, dass die Dateien natürlich mit im jar File landen und zwar ohne das src.


----------



## VPChief (27. Jun 2020)

Danke erstmal für die Antwort


> Ressourcen lädt man in der Regel über den Classloader. Ein gängiger Weg ist etwas wie:
> getClass().getResourceAsStream("/textures/......")



Das habe ich versucht, aber da kommen da immer Fehlermeldungen.
Daher war ich froh die andere Methode zu finden.
Geht das denn auch mit dieser Methode, die Dateien direkt in die jar zu bekommen, und wie geht das überhaupt?


----------



## kneitzel (27. Jun 2020)

Also ich habe keine Ahnung, wie Eclipse hier Projekte im eigenen Format handhabt. Üblich bei Gradle ist, dass Du einen Ordner src/main/java hast für Java Dateien und src/main/resources für die Resourcen.


Ich habe mal etwas geschaut und z.B. https://stackoverflow.com/questions...llow these steps:,by inspecting it using 7zip. gefunden.

Wobei es erst einmal so klingt, dass er Ressourcen aus dem src Ordner immer nehmen würde, daher sollte textures/underground tex/tex2.png enthalten sein. Da könnte ich mir nur vorstellen, dass das Leerzeichen ein Problem machen könnte.


----------



## VPChief (27. Jun 2020)

Also, ich habe auch dateien, die ohne leerzeichen sind, die Funktionieren auch nicht. Und wie bekomme ich das in die Jar?

Soll ich dann diese Option auswählen, oder?


----------



## VPChief (27. Jun 2020)

Dumm von mir. hätt ich einfach testen können, hab ich dann auch, hat auf jeden fall nicht geklappt. Aber wenn ich jetzt so andere Programme ansehe, haben die ihre Bilder und Dateien immer in Extra Ordnern neben der exe datei. Ist das in Eclipse nicht möglich, das so zu machen?


----------



## kneitzel (27. Jun 2020)

Also natürlich kannst Du Dateien auch neben dem jar file haben. Dann kannst Du halt mit dem Pfad zu der jar Datei (https://stackoverflow.com/questions/320542/how-to-get-the-path-of-a-running-jar-file) darauf zugreifen. Aber bei Ressourcen ist es bei Java üblich, Ressourcen im jar vor zu halten. Das läuft beim Bau-Prozess auch automatisch.

Und das, was Du in #5 ansprichst, ist ein ganz anderes Thema. Da geht es um den Umgang mit Abhängigkeiten. Das ist etwas anderes als die Ressource Dateien deines Programmes.

Hast Du denn das jar File einmal angesehen? Sind die Bilder da mit eingepackt worden?


----------



## VPChief (27. Jun 2020)

.


----------



## VPChief (27. Jun 2020)

JustNobody hat gesagt.:


> Hast Du denn das jar File einmal angesehen? Sind die Bilder da mit eingepackt worden?


Wie meinst du das?


----------



## kneitzel (27. Jun 2020)

Du kannst ein jar z.B. mit 7zip ansehen. Dann kannst du nachvollziehen, was wo im Jar gelandet ist.


----------



## VPChief (27. Jun 2020)

Tatsächlich, die Bilder sind drin, müsste doch dann eigentlich funktionieren, oder?

So siehts da drin aus^^

So siehts im Programm aus. Auf den leeren buttons sollten eigentlich Bilder sein.


----------



## kneitzel (27. Jun 2020)

Also die Bilder sind drin? Wie versuchst Du diese zu laden? Den Ansatz, wie es gehen sollte, habe ich ja aufgezeigt.


----------



## VPChief (27. Jun 2020)

getClass().getResourceAsStream("/textures/......")

Du meinst das?
	
	
	
	





```
JButton start = new JButton ();
start.getClass().getResourceAsStream("textures\\Button_Start.png");
```
Das mache ich so, aber dann bleibt der Button leer.


----------



## kneitzel (27. Jun 2020)

Und wegen dem Leerzeichen im Namen: Das habe ich jetzt auch einmal ausgetestet und das geht ganz ohne Probleme.

Nur was mich wundert: Auf dem Bildschirm sehe ich unter textures kein untergrund tex - das sollte eclipse dann doch eigentlich auch anzeigen ...

Aber wenn es so im jar drin ist, dann muss es ja stimmen ...



VPChief hat gesagt.:


> getClass().getResourceAsStream("/textures/......")
> 
> Du meinst das?
> 
> ...



a) kein Backslash - nutz in Java immer den Forward-Slash.
b) Du startest nicht mit einem Slash. Dadurch fängt er im Package der Klasse an zu suchen, d.h. er will im jar ein program/textures/....

Bei so Methoden, die Du nicht kennst, würde ich generell immer empfehlen, auch einmal die Dokumentation zu lesen. Da steht sowas dann auch immer mit drin.


----------



## VPChief (27. Jun 2020)

Wie würdest du das jetzt machen? Das laden von Bildern?


----------



## kneitzel (27. Jun 2020)

Die Bilder, so sie fest zum Programm gehören, mit ins jar File packen und da dann mittels der getResourceAsString Methode laden.


----------



## VPChief (27. Jun 2020)

Ok. Und wie würdest du die Methode im Code benutzen? Das kann ich nicht.
getClass().getResourceAsStream("/textures/Button_Start.png");
So?


----------



## kneitzel (27. Jun 2020)

Also was ich in der Regel mache:
Ich nutze getResourceAsStream in Zusammenhang mit ImageIO zum Laden eines Bildes.
Das sieht man dann als erste Antwort in https://stackoverflow.com/questions/22733881/java-swing-unable-to-load-image-using-getresource

Die zweite Antwort zeigt, wie es ohne Image geht, da wird dann statt getResourceAsStream getResource benutzt, was eine URL liefert. Ich weiß nicht mehr genau, unter welchen Bedingungen mir das aber mal Probleme gemacht hat in der Vergangenheit, aber das war wohl etwas, mit Experimenten bezüglich packen der jar in eine exe incl. Schutz oder so ... also ggf. Vernachlässigbar


----------



## mihe7 (27. Jun 2020)

VPChief hat gesagt.:


> So siehts da drin aus^^


Auf dem Bild sieht man aber nur den Ordner textures, nicht ob in dem Ordner die Bilder auch wirklich vorhanden sind.



VPChief hat gesagt.:


> Das mache ich so, aber dann bleibt der Button leer.


Dein Code 

```
JButton start = new JButton ();
start.getClass().getResourceAsStream("textures\\Button_Start.png");
```
gibt auch wenig Sinn. Mal abgesehen davon, dass hier der Schrägstrich zu verwenden ist, wie @JustNobody ja bereits angemerkt hat, lässt Du Dir zwar einen Stream liefern, machst damit aber nichts.


```
// Stream holen, und das "darin enthaltete" Bild einlesen
Image image = ImageIO.read(getClass().getResourceAsStream("textures/Button_Start.png"));
// Bild als Icon des Buttons start setzen
start.setIcon(new ImageIcon(image));
```


----------



## VPChief (28. Jun 2020)

Danke,


mihe7 hat gesagt.:


> Java:
> // Stream holen, und das "darin enthaltete" Bild einlesen
> Image image = ImageIO.read(getClass().getResourceAsStream("textures/Button_Start.png"));
> // Bild als Icon des Buttons start setzen
> start.setIcon(new ImageIcon(image));


Das wollte ich wissen, wie ich das Verwende. Werde es mal Testen, aber so eine Methode hat mir vor 2 Monaten oderso schon probleme gemacht


----------



## VPChief (28. Jun 2020)

Genau diese Fehlermeldung kommt dann bei mir immer, und kam damals schon immer:

Cannot make a static reference to the non-static method getClass() from the type Object.

Steht hier:

Ich weiss echt nicht warum.


----------



## kneitzel (28. Jun 2020)

Bist Du in einer statischen Methode? Wie baust Du derzeit deinen Code auf? Die Erstellung von so Controls ist doch etwas, das in der Regel im Konstruktor abläuft oder in einer non static Methode, die dann ein neues Fenster erstellt.

Aber unabhängig von dieser generellen Frage: Alles, was Du brauchst, ist ja eine Klasse. Diese bekommst Du z.B. über this.getClass() (oder eben gekürzt als getClass()) was aber natürlich nur in non static Methoden geht, da es sonst ja keine Instanz gibt.
Oder eben über MeineKlasse.class, wobei Du MeineKlasse halt ersetzen musst.

Und ganz nebenbei: In dem Link, den ich gebracht habe, ist ein komplettes Beispiel drin. Bei Antwort 1 mit dem GetResourceAsStream ist das sogar als minimales Beispiel in der static main Methode und daher ist da genau dieses KlassenName.class zu sehen:

```
public static void main(String[] arguments) throws IOException {

    JFrame frame1 = new JFrame();
    frame1.setTitle("Frame1");
    frame1.setSize(500, 500);
    frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    FlowLayout flo = new FlowLayout();
    frame1.setLayout(flo);

    InputStream resourceAsStream = IconTest.class.getResourceAsStream("strawberry.jpg");
    Image image = ImageIO.read(resourceAsStream);

    JLabel label1 = new JLabel(new ImageIcon(image));
    frame1.add(label1);
    frame1.setVisible(true);
}
```
um einfach einmal das Beispiel komplett zu kopieren von https://stackoverflow.com/questions/22733881/java-swing-unable-to-load-image-using-getresource


----------



## VPChief (28. Jun 2020)

Ich versteh da nur noch Banhof. Und mit setIcon(new ImageIcon("src\\textures\\....png")); geht da nichts?


----------



## kneitzel (28. Jun 2020)

Die Sourcen hast Du auf Deinem System. Die übersetzt Du ja um etwas neues zu erstellen, welches Du dann weiter geben kannst. Das ist bei Windows Entwicklung in anderen Sprachen (z.B. c++ / c#) eine exe ... bei Java ist es erst einmal eine jar Datei.

Da hast Du dann aber kein src Ordner mehr. Daher ist dieser Ansatz so erst einmal nicht zielführend.

Aber Java bietet da natürlich entsprechende Techniken an, um
a) Ressourcen mit in das, was weitergegeben wird, zu packen.
b) auf diese zusammen gepackten Ressourcen zu zu greifen.

Und nun hast Du doch auch schon fast fertigen Code bekommen. Du musst nur minimale Änderungen machen:
"IconTest" musst Du durch den Namen Deiner Klasse ersetzen.
"strawberry.jpg" musst Du nur noch durch den Pfad / Namen deiner Datei ersetzen ("/textures/.......")

Ansonsten noch einfach folgende Hilfsklasse, die Du einbinden kannst:

```
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.io.IOException;

public class ImageHelper {
    /**
     * Loads an Image of a given resource path.
     * @param resource path to a resource to load.
     * @return Loaded Image.
     * @throws IOException
     */
    public static Image loadImage (final String resource) throws IOException {
        return ImageIO.read(ImageHelper.class.getResourceAsStream(resource));
    }

    /**
     * Loads an ImageIcon of a given resource path.
     * @param resource path to a resource to load.
     * @return Loaded ImageIcon.
     * @throws IOException
     */
    public static ImageIcon loadImageIcon (final String resource) throws IOException {
        return new ImageIcon(loadImage(resource));
    }
}
```

Dann kannst Du einfach schreiben:
`setIcon(ImageHelper.loadImageIcon("/textures/....png"));`


----------



## VPChief (28. Jun 2020)

Danke für die Erklärung.
Jetzt habe ich es so gemacht:

```
InputStream resourceAsStream = Main_Class.class.getResourceAsStream("src\\textures/Button_Start.png");
        Image image;
        try {
            image = ImageIO.read(resourceAsStream);
        } catch (IOException e2) {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }
        JButton start = new JButton  (new ImageIcon(image));
```
Aber dann kommt da ne Fehlermeldung bei:

```
(new ImageIcon(image));
```

The local variable image may not have been initialized


----------



## thecain (28. Jun 2020)

Danke für die Erklärung. Ich hab mal was ganz anderes gemacht.

Lies nochmal den Beitrag von @JustNobody ...

Die Fehlermeldung die du kriegst, kommt daher, dass im try ein Fehler auftreten könnte, den du catchst. Dann wäre image nicht initialisiert.


----------



## kneitzel (28. Jun 2020)

Und wie auch schon mehrfach erwähnt und auch erläutert: das src ist nur bei Dir in der Entwicklungsumgebung... lass es weg!

Und vergiss die Backslash in Java und nutze doch nur den einfachen Slash.


----------



## VPChief (28. Jun 2020)

Also. Das mit dem Backslash hab ich mir mal Angewohnt, von ein paar Tutorials auf YouTube. Deshalb mach ich den Jetzt Automatisch


JustNobody hat gesagt.:


> Code:
> public static void main(String[] arguments) throws IOException {
> 
> JFrame frame1 = new JFrame();
> ...



Ich habe das jetzt Zeile für Zeile in eine Klasse Test eingefügt, doch es gibt immer noch Fehlermeldungen

```
package programm;

import java.awt.FlowLayout;
import java.awt.Image;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

import org.omg.CORBA.portable.InputStream;

public class Test {
    
    public static void main(String[] arguments) throws IOException {

        JFrame frame1 = new JFrame();
        frame1.setTitle("Frame1");
        frame1.setSize(500, 500);
        frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        FlowLayout flo = new FlowLayout();
        frame1.setLayout(flo);

        InputStream resourceAsStream = (InputStream) Test.class.getResourceAsStream("textures/Button_Start.png");
        Image image = ImageIO.read(resourceAsStream);
        JLabel label1 = new JLabel(new ImageIcon(image));
        frame1.add(label1);
        frame1.setVisible(true);
    }

}
```
So ist der Code... oder habe ich jetzt wieder  etwas ,,ganz anderes gemachtˮ wie *thecain *schon so treffend bemert hat.


----------



## kneitzel (28. Jun 2020)

a) Die Klasse, die ich gepostet habe, kannst Du 1:1 verwenden. Dafür war sie iegentlich gedacht.
b) InputStream ist java.io.InputStream und nicht org.omg.CORBA.portable.InputStream - wenn Du den Import richtig setzt, dann musst Du auch keinen cast machen.
c) Wie schon in #14 der Punkt b): Du musst mit einem / anfangen, ansonsten sucht er relativ zum Namespace der Klasse. Der Namespace ist bei Dir programm, daher würde er ein /programm/textures/Button_Start.png suchen. mit einem führenden / verhinderst Du das.


----------



## LimDul (28. Jun 2020)

VPChief hat gesagt.:


> Ich habe das jetzt Zeile für Zeile in eine Klasse Test eingefügt, doch es gibt immer noch Fehlermeldungen


Da wir nicht Hellensehen können - Was für Meldungen? Und wo genau liegt die Datei Button_Start.png bei dir jetzt?


----------



## VPChief (28. Jun 2020)

Sorry, Die Fehlermeldung wollte ich eigentlich einfügen:
Exception in thread "main" java.lang.IllegalArgumentException: input == null!
    at javax.imageio.ImageIO.read(Unknown Source)
    at programm.Test.main(Test.java:27)
Die Datei Button_Start.png liegt im Textures Ordner jetzt im Package.


----------



## VPChief (28. Jun 2020)

Danke


JustNobody hat gesagt.:


> b) InputStream ist java.io.InputStream und nicht org.omg.CORBA.portable.InputStream - wenn Du den Import richtig setzt, dann musst Du auch keinen cast machen.
> c) Wie schon in #14 der Punkt b): Du musst mit einem / anfangen, ansonsten sucht er relativ zum Namespace der Klasse. Der Namespace ist bei Dir programm, daher würde er ein /programm/textures/Button_Start.png suchen. mit einem führenden / verhinderst Du das.



Das hat mir geholfen, jetzt funktioniert das. (zumindest in Eclipse, und in der Klasse Test und nicht in meiner Main_Class.) Wenn ich es Exportiere Kommt ein Fenster:
JAR export finished with warnings. See details for additional information.
Exported with compile warnings: BilderimJar/src/programm/Main_Class.java
Dabei exportiere ich nur Test.
Und die Exportierte JAR kann ich nicht ausführen.
Nach dem Exportieren kann ich es auch nicht mehr in Eclipse ausführen. Dann kommt wieder unser altbekanntes:
Exception in thread "main" java.lang.IllegalArgumentException: input == null!
    at javax.imageio.ImageIO.read(Unknown Source)
    at programm.Test.main(Test.java:27)


----------



## kneitzel (28. Jun 2020)

Also ich kann Dir im Augenblick nicht folgen. Ich habe ehrlich gesagt gerade keine Ahnung mehr, was Du derzeit genau machst.

Generell scheint Eclipse das ganze Projekt zu bauen und in da Jar zu packen. Wenn Du da also mehrere Klassen hast, dann wirst Du wohl alles exportiert haben. Falls Du da doch irgendwas einschränkst, dann ist die Frage, was da nun fehlt. Dazu wäre eine Fehlermeldung sinnvoll (Was bedeutet "Kann das jar nicht ausführen"?) Generell kann man aber - wie schon beschrieben - in das jar File hinein schauen. Beim Ausführen sind dann Dinge wichtig wie:
- Stimmt das Manifest? Ist es vorhanden? Was für eine Klasse ist da als Main Class angegeben?
- Sind die Klassen und Ressource Dateien vorhanden (und am richtigen Platz)?

Und ohne es böse zu meinen: Evtl. macht es Sinn, das alles etwas langsamer anzugehen und dann Schritt für Schritt ein Thema nach dem anderen abzuhaken. Ein Lehrbuch oder ähnliches wäre da hilfreich. Ich habe da Gefühl, dass da einige Themen auf einmal auf die zu gekommen sind und Dir komplett der Überblick fehlt. Und ich sehe gerade nur wenig Ansätze, da die richtigen Ansätze für Dich zu finden.


----------



## VPChief (28. Jun 2020)

Um dir einen Überblick zu verschaffen:
Ich habe neben meiner Main_Class eine zweite Klasse, die ich Test genannt habe gemacht. Dort habe ich den Code aus #22 genommen und eingefügt. dann habe ich deine Verbesserungsvorschläge aus #29 befolgt und habe die Test Klasse ausgeführt. Es hat funktioniert. Dann habe ich bei Exportieren die Test Klasse ausgewählt und habe als Speicherort mein Desktop ausgewählt. Nach dem Exportieren kam dieses Fenster: 

*JAR export finished with warnings. See details for additional information.
Exported with compile warnings: BilderimJar/src/programm/Main_Class.java *

Als ich dann die JAR auf dem Desktop ausführen wollte, ging das nicht. Dann wollte ich es in Eclipse ausführen, und dann kam wieder die Fehlermeldung

*Exception in thread "main" java.lang.IllegalArgumentException: input == null!
    at javax.imageio.ImageIO.read(Unknown Source)
    at programm.Test.main(Test.java:27) *.
Ich habe mich mit dieser Methode noch nie richtig ausseinandergesetzt, weil bei mir immer so viele Fehlereldungen kamen und ich dann die andere Methode gefunden habe. Deshalb sind meine Fragen meistens dumm. Entschuldigung dafür 😁


----------



## mihe7 (28. Jun 2020)

VPChief hat gesagt.:


> Das mit dem Backslash hab ich mir mal Angewohnt, von ein paar Tutorials auf YouTube.


Woher auch sonst...

Zum Rest: Zip Dein Projekt mal und häng die Datei hier an. Dann kann man sich das Problem mal ansehen.


----------



## VPChief (28. Jun 2020)

Hier ist mal das Pojekt


----------



## kneitzel (28. Jun 2020)

Was als erstes auffällt: textures ist nicht mehr im src Ordner. Da solltest Du es aber lassen, damit die Dateien auch im jar landen.


----------



## LimDul (28. Jun 2020)

Wieso hast du denn jetzt die Bilder verschoben? Die liegen im Screenshot auf der ersten Seite noch im src-Ordner, jetzt liegen sie lose rum und so kann das nicht funktionieren.

Möglichkeit a) Die Bilder wieder in den Scr Folder schieben (Aber *nicht* die Pfade im Programm anpassen!)
Möglichkeit b) einen neuen Ordner resourcen erstellen, da Verzeichnisse mit den Bilder reinschieben und den Ordner in den Classpath aufnehmen.

Wenn du mit getResourceAsStream arbeitest, gilt: "/" bezeichnest die oberste Ebene deines Classpath. Das heißt bei /textures/Button_Start.png erwartet java die Datei im Ordner textures der auf der obersten Ebene des Classpath liegt - also *in src*, wenn du es aus Eclipse startest oder im Jar wenn du es als Jar startest.


----------



## mihe7 (28. Jun 2020)

Mal abgesehen von den Kommentaren von @JustNobody und @LimDul: die Main-Klasse ist Schrott, da brauchst Du Dich über den Compiler-Fehler nicht zu wundern. Dann willst Du ein Bild /textures/Button_Start.png laden, das überhaupt nicht existiert. Das Teil heißt btnStart.png und nicht Button_Start.png


----------



## VPChief (28. Jun 2020)

Ups 😁 (Mein Lieblings Smiley) Hab den Namen geändert. Funktioniert aber immer noch nicht. *LimDul *und *JustNobody*, das werde ich ändern.*
*


----------



## mihe7 (28. Jun 2020)

Was betreibst Du da?!? Du musst lediglich den textures-Ordner wieder nach src verschieben und die Datei richtig benennen bzw. im Code den richtigen Dateinamen angeben, dann funktioniert das einwandfrei.


----------



## kneitzel (28. Jun 2020)

Ich kenne Eclipse nicht so genau. Stört es den Build, wenn da eine Klasse nicht übersetzt werden kann? Nicht dass da immer ein alter Stand ausgeführt wird ....

Generell würde ich immer erst dafür sorgen, dass alles übersetzt, ehe ich irgend etwas testen würde. Das wäre noch eine Anregung von mirß


----------



## VPChief (28. Jun 2020)

mihe7 hat gesagt.:


> Was betreibst Du da?!? Du musst lediglich den textures-Ordner wieder nach src verschieben und die Datei richtig benennen bzw. im Code den richtigen Dateinamen angeben, dann funktioniert das einwandfrei.


Das habe ich ja mit ändern gemeint. was meinst du mit übersetzen?


----------



## LimDul (28. Jun 2020)

Das es keine Kompilier-Fehler mehr gibt (Sollte Eclipse aber nicht stören, solange alles kompiliert, was man braucht)


----------



## mihe7 (28. Jun 2020)

Das ist ja unglaublich.


----------



## VPChief (29. Jun 2020)

Weiss jetzt jemand wie ich das hinbekomme, die Bilder in die JAR zu bekommen?


----------



## kneitzel (29. Jun 2020)

Nein, das wissen wir alle nicht. Wir schreiben hier nur ständig irgendwelche Dinge um Dich zu irritieren und zu ärgern. Daher ist es schon eine super Leistung von Dir, das Du dies erkannt hast und diese Aussagen direkt ignorierst.

Und Java ist einfach mangelhaft, da es so einfache Dinge wie Resourcen in eine Jar Datei Packen nicht kann. Auch wenn das einige hier nicht wahr haben wollen und so idiotisches Zeug erzählen von wegen "textures Ordner in src Ordner verschieben" (#41, #38, #37)

Die Frage ist nur, wer Deinen Rechner gehackt hatte. Denn irgend wer von Uns muss ganz offensichtlich Deinen Rechner gehackt haben und heimlich manuell die Bilder in das jar kopiert haben, denn in #11 war es ja mal drin... Schon eine Anzeige wegen Computer-Sabotage bei der Polizei gestellt?



Ok, sorry, wegen diesem sarkastischen Absatz, aber nur damit Du es verstehst einmal eine kurze Übersicht zu dem, was eclipse da so auf magische Weise macht:

Der src Ordner ist für Eclipse der Ordner, wo es Dateien als Eingabe nehmen soll. Und es gibt ein Zielverzeichnis, das man zwar beliebig festlegen kann aber per default und auch bei dir ist dies das bin Verzeichnis. (.classpath Datei: <classpathentry kind="output" path="bin"/>)
Und nun geht Eclipse beim bauen alle Dateien durch und schaut, ob es mit der Datei etwas anfangen kann:
- java Dateien werden übersetzt. Als Ergebnis landen .class Dateien im bin Verzeichnis
- Bilder werden kopiert.

Somit kannst Du Deine Bilder samt Ordner in src kopieren. Dann sollte Eclipse diese auch noch ins bin Verzeichnis kopieren (Da kannst Du dann nach sehen)

Der Inhalt vom bin Verzeichnis dürfte dann im Jar landen - d.h. wenn die Bilder im bin Verzeichnis zu finden sind, dann sollten sie auch im jar sein.

Wichtig: Du machst von Hand nichts mit dem bin Verzeichnis. Nicht das du auf die Idee kommst, die Bilder da rein zu kopieren. Das Verzeichnis ist ein generiertes Verzeichnis und du kannst es auch komplett löschen und Eclipse erzeugt es dann neu (samt Inhalt).


----------



## mihe7 (29. Jun 2020)

VPChief hat gesagt.:


> Weiss jetzt jemand wie ich das hinbekomme, die Bilder in die JAR zu bekommen?


Wenn Du gemacht hast, was Dir geschrieben wurde, dann sollte es funktionieren. Wenn es dennoch nicht funktioniert, müsstest Du nochmal ein Zip anfügen, damit man sich das wieder ansehen kann.


----------



## VPChief (29. Jun 2020)

Ich habe ehrlich gesagt keine Ahnung warum es gestern nicht funktioniert hat. Ich habe es heute nochmal gestartet, und jetzt funktioniert es. Vielen Dank, und entschuldigt, dass ich mich manchmal dumm angestellt habe


----------



## kneitzel (29. Jun 2020)

VPChief hat gesagt.:


> und entschuldigt, dass ich mich manchmal dumm angestellt habe



Das ist prinzipiell in Ordnung. Das Nervige an sowas (aus meiner Sicht) bist nicht Du, sondern einfach nur, dass einem teilweise die Ideen ausgehen und man überlegt, was evtl. falsch verstanden wurde.  Also auf gar keinen Fall pers. nehmen - auch wenn mal etwas sehr sarkastisches geantwortet werden sollte. 

Und ein Teil des Problems mag auch gewesen sein, dass nur Teillösungen gepostet wurden und dann die Umsetzung erschwert war. (Am Anfang mein Hinweis mit dem getResosurceAsStream aber ich habe beim Schreiben vergessen, dass ImageIO auch notwendig ist...) 

Es freut mich auf jeden Fall, dass es nun geklappt hat und hoffe, dass der eine oder andere Punkt durch Erklärungen auch deutlich geworden ist.


----------



## VPChief (29. Jun 2020)

Es Funktioniert jetzt, blos das Projekt, dass ich angefügt hatte, war nur ein Projekt extra hierfür erstellt, und jetzt muss ich in ein paar anderen Projekten insgesamt an 43 Stellen den Code um schreiben. Scheu mich davor😀


----------



## kneitzel (29. Jun 2020)

VPChief hat gesagt.:


> Es Funktioniert jetzt, blos das Projekt, dass ich angefügt hatte, war nur ein Projekt extra hierfür erstellt, und jetzt muss ich in ein paar anderen Projekten insgesamt an 43 Stellen den Code um schreiben. Scheu mich davor😀



Das ist evtl. ein Zeichen für doppelten Code. Don't Repeat Yourself - DRY: Hier könnte es evtl. Sinn machen, zu schauen, was da doppelt ist um dann den Code nur noch an einer Stelle zu haben und dann halt an den 43 Stellen nur noch einen Methodenaufruf zu haben.

Das aber nur als kleiner Hinweis am Rande. Viel Erfolg (und Spaß) bei den Anpassungen.


----------



## kneitzel (29. Jun 2020)

VPChief hat gesagt.:


> war nur ein Projekt extra hierfür erstellt



Das war übrigens eine super Sache! Wird oft als "Minimales, compilierbares Beispiel" bezeichnet. Eine Sache, die man nicht genug loben kann, denn das findet man nicht oft.


----------



## mrBrown (29. Jun 2020)

BTW, statt sowas:

```
InputStream resourceAsStream = Test.class.getResourceAsStream("textures/Button_Start.png");
Image image = ImageIO.read(resourceAsStream);
JLabel label1 = new JLabel(new ImageIcon(image));
```

sollte auch einfach das möglich sein:

```
JLabel label1 = new JLabel(new ImageIcon(Test.class.getResource("textures/Button_Start.png")));
```

Das Lesen des Images kann ImageIcon selbst übernehmen, je nach Verwendung hat das auch Vorteile.


----------



## VPChief (3. Aug 2020)

Hallo, 
Um hierauf zurückzukommen(ja ich weiss es ist etwas spät), mir ist gerade aufgefallen, wenn ich ein Video mit dem VLC Player abspielen will, hab ich das bisher so gemacht:

```
try {
                                    Desktop.getDesktop().open(new File("src\\Test.mp4"));
                                } catch (IOException e1) {
                                
                                    e1.printStackTrace();
                                }
```
Da ich nun weiss wie falsch das ist, und dass das nach dem Exportieren nicht funktioniert, versuche ich das anders zu lösen:

```
try {
                                    Desktop.getDesktop().open(new File("/Test.mp4"));
                                } catch (IOException e1) {
                                
                                    e1.printStackTrace();
                                }
```
Klappt nicht. Auch nach ein paar anderen versuchen wurde ich auch nicht schlauer.
Wäre sehr hilfreich wenn hier jemand den richtigen Code reinkopieren könnte.

Danke im vorraus

VPChief (kann man eigentlich seinen Namen ändern?)


----------



## VPChief (3. Aug 2020)

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: The file: \Test.mp4 doesn't exist.
    at java.awt.Desktop.checkFileValidation(Unknown Source)
    at java.awt.Desktop.open(Unknown Source)
    at eeeeeeeeeeeeeeee.d.Tets$8$4$1.actionPerformed(Test.java:317)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(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.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.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)

Ich hatte die Fehlermeldung vergessen, das ist sie


----------



## VPChief (3. Aug 2020)

weiterer Versuch: wenn die Datei auf dem Betriebsystem liegt funktioniert es, meine liegt aber im jar


----------



## kneitzel (3. Aug 2020)

Also deine Erwartungshaltung ist seltsam - als ob hier lauter Leute ständig rumhängen um sofort zu antworten....

Und wenn das Viseo im jar enthalten ist  kannst du es so nicht wiedergeben. Bei der beschriebenen Lösung wird die Datei im Dateisystem benötigt.

Datei in jar: Datei mit Java Mitteln lesen, also z.B. über Classloader und getResourceAsStream oder so.
Datei nicht im jar: datei kann mit Betriebssystem-Mitteln geöffnet werden.


----------



## VPChief (3. Aug 2020)

über classloader habe ich auch schon versucht, aber wie du sicher schon weisst, stell ich mich immer relativ dumm an. D.h. dass ich zu dumm war das hinzubekommen


----------



## LimDul (3. Aug 2020)

Naja, entweder aus dem Jar entpacken in eine Datei und dann VLC damit füttern oder einen Server starten und VLC darüber streamen lassen. Direkt den Stream aus dem Jar, wird vermutlich nicht gehen.


----------



## VPChief (3. Aug 2020)

schade. auch zu einem Player gibt es laut Google keine möglichkeit. Dann muss ich wohl noch gucken, aber jetzt weiss ich zumindest, dass es nicht geht, Danke trotzdem


----------



## mihe7 (4. Aug 2020)

Du kannst z. B. mplayer oder vlc direkt aufrufen und mit einem "-" angeben, dass von der Standardeingabe gelesen werden soll. Hier ein Beispiel für mplayer:


```
import java.io.*;

public class Test {
    public static void main(String[] args) throws Exception {
        Process p = new ProcessBuilder("mplayer", "-cache", "1024", "-")
            .redirectOutput(ProcessBuilder.Redirect.INHERIT)
            .redirectError(ProcessBuilder.Redirect.INHERIT)
            .start();

        try(InputStream is = Test.class.getResourceAsStream("/test.mpg");
                OutputStream os = p.getOutputStream()) {
            is.transferTo(os);
        }

        p.waitFor();
    }
}
```


----------



## VPChief (4. Aug 2020)

Danke, allerdings kommt dann bei 

```
is.transferTo(os);
```
diese Fehlermeldung:





> The method transferTo(OutputStream) is undefined for the type InputStream


----------



## kneitzel (4. Aug 2020)

transferTo gibt es ab Java 9. Falls Du noch Java 8 verwendest, musst Du das umkopieren natürlich selbst schreiben. Das wäre dann z.B. code in der Art:

```
// copy data from input stream to output stream
    while ((length = is.read(bytes)) != -1) {
        os.write(bytes, 0, length);
    }
```

Die Variablen length und bytes müssen natürlich definiert werden (und bytes initialisiert).


----------



## mihe7 (4. Aug 2020)

JustNobody hat gesagt.:


> transferTo gibt es ab Java 9.


Hat der Test, welche Java-Version er verwendet, also funktioniert


----------



## VPChief (4. Aug 2020)

Das Projekt ist schon ein bisschen älter. Ich hab mir jetzt aber ein projekt mit java 9 erstellt, allerdings macht mir eclipse immer so ein dummes rotes ausrufezeichen an das Projekt hin.

Ausserdem gibt es bei mir immer Fehlermeldungen an der Klasse:


> The type java.lang.Object cannot be resolved. It is indirectly referenced from required .class files





> Implicit super constructor Object() is undefined for default constructor. Must define an explicit constructor



wenn ich in die klasse jetzt das Beispiel von @mihe7  einfüge, und dann trotz den Fehlermeldungen starte kommt ausserdem das hier:

auch alle alten Projekte lassen sich jetzt nicht mehr starten, ich fange langsam an auszurasten.


----------



## kneitzel (4. Aug 2020)

Da scheinst Du das JDK / JRE nicht richtig konfiguriert zu haben. Die erste Meldung kenne ich etwas, wenn das JDK nicht richtig konfiguriert ist. Dann kennt er das JDK halt nicht und somit auch kein java.lang.Object und so ...
Das Weitere dürften dann mehr oder weniger Folgefehler sein.


----------



## VPChief (4. Aug 2020)

konfigurieren? oh je*. *


----------



## kneitzel (4. Aug 2020)

Sollte eigentlich nicht so wild sein.

Du hast also ein Java JDK 9 installiert? Dann schau erst einmal, ob dies korrekt eingetragen ist:
Window -> Preference
Da dann im Fenster unter Java -> Installed JREs nachschauen, ob dies da korrekt gelistet ist. 
Ggf. Hinzufügen. Und ggf. bei mehreren Java 9 noch unter Execution Environments (Unterpunkt von Installed JREs) noch auswählen, was benutzt werden soll ...
Das wäre das Erste.

Um das dann ggf. im Projekt noch anzupassen: Properties des Projektes und da den Java Build Path.
Im Reiter Libraries das JRE System Library markieren und Remove klicken.
Dann Add Library -> JRE System Library
Da kannst Du dann entweder die JRE direkt wählen (Mitte) oder oben eben ein Environment auswählen (z.B. java-9 - dann nimmt Eclipse das installierte bzw. bei mehreren zur Auswahl das, was konfiguriert wurde...

Aber ich bin kein Eclipse Experte. Daher nur diese grobe Wegbeschreibung.


----------



## VPChief (4. Aug 2020)

The selected JRE does not support the current compiler compliance level of 1.8

Ich glaube das reicht, um festzustellen, dass da was nicht stimmt.


----------



## kneitzel (4. Aug 2020)

Frage 1: Hast Du ein Java 9 installiert? (Oder neuer? Z.B. von https://adoptopenjdk.net/ wäre Java 11 das, was ich Dir empfehlen würde!)

Frage 2: So Du 1 mit Ja beantworten kannst: Hast Du einfach einmal probiert, das installierte JDK einzutragen? (Da steht zwar JREs, aber das JDK kannst Du da eintragen ....)


----------



## VPChief (4. Aug 2020)

Ich habe eclipse nochmal neu installiert. Das ausführen kalappt wieder, und ich hab jetzt auch die neuste version. ausserdem zeigt es mir keine Fehlermeldungen an, ich habe jetzt auch java 14. Jetzt habe ich meine Projekte wieder in die alte Workspace verschoben, und es funktioniert, bis auf dass das System den (richtig) angegebenen Pfad nicht finden kann


----------



## kneitzel (5. Aug 2020)

Das Thema mit dem richtig angegebenen Path hatten wir doch bereits behandelt:
- Wenn die Datei im JAR enthalten ist, dann kannst Du es in der Regel auf Betriebssystem-Ebene nicht direkt angeben. Daher ist die Datei nicht als Parameter angebbar.
- Du kannst also die Datei extrahieren an einen anderen Ort oder die Daten in Java Lesen und dem externen Programm übergeben oder gar gleich ganz in Java anzeigen (https://github.com/caprica/vlcj sollte da z.B. funktionieren)


----------



## VPChief (5. Aug 2020)

ich verstehe nicht ganz was man damit machen kann.


----------



## VPChief (5. Aug 2020)

Man kann damit einen VLC Player in das Programm einbetten, oder?


----------



## kneitzel (5. Aug 2020)

Ja, so habe ich es verstanden. Aber ich habe damit auch noch nichts gemacht und es gibt bestimmt auch noch mehr Möglichkeiten, Videos mit Java anzuzeigen. Google wird einem da bestimmt einiges an Möglichkeiten liefern.


----------



## VPChief (5. Aug 2020)

Ok, dann erstmal vielen Dank, ich denke ich werde mich mit diesem VLCJ mal näher beschäftigen


----------

