Eclipse: Projekt mit src ordner exportieren.

Diskutiere Eclipse: Projekt mit src ordner exportieren. im AWT, Swing, JavaFX & SWT Bereich.
VPChief

VPChief

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:
1593342151020.png
Ich weiss echt nicht warum.
 
J

JustNobody

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:
Code:
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

VPChief

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

JustNobody

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:
Java:
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

VPChief

Danke für die Erklärung.
Jetzt habe ich es so gemacht:
Java:
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:
Java:
(new ImageIcon(image));
The local variable image may not have been initialized
 
T

thecain

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.
 
J

JustNobody

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

VPChief

Also. Das mit dem Backslash hab ich mir mal Angewohnt, von ein paar Tutorials auf YouTube. Deshalb mach ich den Jetzt Automatisch
Code:
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);
}
Ich habe das jetzt Zeile für Zeile in eine Klasse Test eingefügt, doch es gibt immer noch Fehlermeldungen
Java:
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.
 
J

JustNobody

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.
 
VPChief

VPChief

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.
 
Zuletzt bearbeitet:
VPChief

VPChief

Danke
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)
 
J

JustNobody

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

VPChief

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 😁
 
J

JustNobody

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.
 
L

LimDul

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

mihe7

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
 
Thema: 

Eclipse: Projekt mit src ordner exportieren.

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben