Wo ist das URL-Problem ?

Diskutiere Wo ist das URL-Problem ? im Java Basics - Anfänger-Themen Bereich.
W

Werniman

Hallo,
ich hab schon wieder mal ein kleines Problemchen, dessen Ursache ich nicht erkenne.


Java:
import java.awt.FlowLayout;
import java.net.URL;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class MeinLabel extends JFrame {

    public static void main(String[] args) {
        new MeinLabel();
    }

    public MeinLabel() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Setze die JLabel per FlowLayout nebeneinander
        setLayout(new FlowLayout());

        // Diese URL verwenden Sie zur Erzeugung eines Icons.
        URL url = getClass().getResource("D:\\schiff.png");

        // Dieses Icon kann schließlich dem JLabel im Konstruktor übergeben werden.
        Icon icon = new ImageIcon(url);
        JLabel bildlabel = new JLabel(icon);
        add(bildlabel);
        // Ein JLabel mit Text
        JLabel textlabel = new JLabel("Gleich weg!");
        add(textlabel);
        textlabel.setText("Neuer Text");
        String str = textlabel.getText();
        System.out.println(str);
        pack();
        setVisible(true);
    }
}
Das ist der Code, wie er in meinem Java-Buch vermerkt ist. Beim Ausführen bekomme ich allerdings eine Nullpointer-Exception:
Exception in thread "main" java.lang.NullPointerException
at javax.swing.ImageIcon.<init>(Unknown Source)
at K18.MeinLabel.<init>(MeinLabel.java:43) (das ist die Zeile "Icon icon=new ImageIcon(url))
at K18.MeinLabel.main(MeinLabel.java:30) ((hier wird das Objekt erzeugt,in dessen Konstruktor sich das Ganze abspielt).

Soweit, sogut. Wenn ich in Zeile 43 das "url" in Klammern direkt gegen den Pfad austausche, läuft das Programm anstandslos. Offenbar scheint also ein Problem in Zusammenhang mit der Zeile vorzuliegen, in der der Pfad ursprünglich definiert wird ("URL url = ... "). Aber warum ?

Testweise hab ich mal die Datei in den gleichen Ordner gelegt wie die *.java bzw *.class-Datei und den Pfad auf "/Schiff.png" geändert, bringt aber auch nix.
Die Files (incl. Bilddateien, *.java und *.class-Files) liegen bei mir in einer Dateistruktur D:\Dummies\src\K18\, die Bilddatei wurden mal testweise auch ins Hauptverzeichnis des Laufwerks kopiert (daher "d:\\Schiff.png").
 
mihe7

mihe7

  1. Mit getResource() verwendest Du den ClassLoader-Mechanismus, um an eine Ressource heranzukommen. Das ist der richtige Weg, wenn es sich um eine Ressource handelt, die Teil der Anwendung ist, d. h. im Classpath der Anwendung liegt.
  2. Dem entsprechend muss die Ressource relativ zum Classpath angegeben werden.
  3. Das verwendete build-System hat Einfluss darauf, wo die Ressource im Projektverzeichnis abgelegt werden muss
Nehmen wir mal Dein Beispiel:

Die Files (incl. Bilddateien, *.java und *.class-Files) liegen bei mir in einer Dateistruktur D:\Dummies\src\K18\,
D. h. im Paket K18? Dann könntest Du per getResource("/K18/Schiff.png") darauf zugreifen.

Wo genau Du die Bilddateien ablegen musst, hängt vom build-System ab. Viele unterscheiden zwischen Quelltext und Ressourcen, manche nicht.

Wenn Du z. B. in NetBeans ant als build-System verwendest, kannst Du die Ressourcen in die gleichen Ordner platzieren, in denen sich auch die .java-Files befinden. Verwendest Du dagegen Maven, müssen die Ressourcen unter src/main/resources/... abgelegt werden.

Befindet sich die Datei dagegen in einem x-beliebigen Verzeichnis (z. B. D:\\Schiff.png), hat das nichts mehr mit Deinem Projekt zu tun. Folglich wird der ClassLoader die Datei auch nicht finden.
 
Thema: 

Wo ist das URL-Problem ?

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben