JavaFX Invalid URL: unknown protocol: d

hk

Bekanntes Mitglied
Ich schaffe es nicht in einer Maven/JavaFX-App eine png-Datei zu laden und einen ImageView zu erstellen. Weder mit einer absoluten noch mit einer relativen Pfadangabe funktioniert es.
Fehlermeldung bei absoluten Pfad:
java.lang.IllegalArgumentException: Invalid URL: unknown protocol: d
Exception in Application start method


Hier der Code:
Java:
  @Override
  public void start(Stage stage) {
 
    // Pictures
    try {
      schuhOL = new ImageView(new
          Image("D:\\Heinz\\EigeneProgrammeSource\\NetBeansProjects\\SchuheGehen\\src\\main\\java\\com\\hk\\schuhegehen\\SchuhOben.png"));
      schuhOL.setX(300);
      schuhOL.setY(250);
    } catch(Exception e) {
      System.out.println(e);
    }
Ersuche um Hilfe, lg heinz
 

httpdigest

Top Contributor
Ein Windows Dateisystempfad ist keine URL.
Um daraus eine URL zu machen, könntest du ein java.io.File mit deinem Dateisystempfad erzeugen und darauf dann toURL() aufrufen.
Da sollte dann eine URL mit dem file: Schema herauskommen.
 

KonradN

Super-Moderator
Mitarbeiter
Die Datei scheint aber das zu sein, was man eine Ressource nennt. Und so sollte diese dann auch geöffnet werden:
a) Ressourcen gehören nach src/main/resource/ und nicht nach src/main/java
b) Laden mit getClass().getResource(…) - das gibt dir die URL. Wenn man einen Stream haben will, dann getResourceAsStream.

Dazu finden sich per Google im Netz aber viele Erklärungen und Beispiele.
 

hk

Bekanntes Mitglied
Die Datei scheint aber das zu sein, was man eine Ressource nennt. Und so sollte diese dann auch geöffnet werden:
a) Ressourcen gehören nach src/main/resource/ und nicht nach src/main/java
b) Laden mit getClass().getResource(…) - das gibt dir die URL. Wenn man einen Stream haben will, dann getResourceAsStream.

Dazu finden sich per Google im Netz aber viele Erklärungen und Beispiele.
Ich habe nun unter src/main einen resources Ordner angelegt und die png-Datei hineingestellt. Den Code habe ich wie folgt geändert:
Java:
  @Override
  public void start(Stage stage) {
 
    // Pictures
    try {
      schuhOL = new ImageView(new
          Image(getClass().getResourceAsStream("/resources/SchuhOben.png")));
      schuhOL.setX(300);
      schuhOL.setY(250);
    } catch(Exception e) {
      System.out.println(e);
    }
Der Fehlercode ist nun:
java.lang.NullPointerException: Input stream must not be null
Exception in Application start method
java.lang.reflect.InvocationTargetException
 

KonradN

Super-Moderator
Mitarbeiter
a) Tippfehler von meiner Seite: resources muss der Ordner heissen. (Sorry, passiert, wenn man am Smartphone etwas schreibt)

b) schuhOL = new ImageView(new Image(getClass().getResourceAsStream("/SchuhOben.png")));

Dann wäre noch ggf. offen, ob Du der IDE mitteilen musst, dass dies der resources Ordner ist. Maven / Gradle haben das so als Standard, aber Entwicklungsumgebungen wie IntelliJ wollen da evtl. noch zusätzliche Aktionen ("Mark directory as --> resources folder" oder so wäre es in IntelliJ).

Wichtig ist: Der Pfad gilt ab dem resources Ordner. Daher eben ohne das führende "/resources". Was passiert ist halt, dass die Dateien so wie sie dort abgelegt wurden, auch im classpath verfügbar gemacht werden.
 

hk

Bekanntes Mitglied
a) Tippfehler von meiner Seite: resources muss der Ordner heissen. (Sorry, passiert, wenn man am Smartphone etwas schreibt)

b) schuhOL = new ImageView(new Image(getClass().getResourceAsStream("/SchuhOben.png")));

Dann wäre noch ggf. offen, ob Du der IDE mitteilen musst, dass dies der resources Ordner ist. Maven / Gradle haben das so als Standard, aber Entwicklungsumgebungen wie IntelliJ wollen da evtl. noch zusätzliche Aktionen ("Mark directory as --> resources folder" oder so wäre es in IntelliJ).

Wichtig ist: Der Pfad gilt ab dem resources Ordner. Daher eben ohne das führende "/resources". Was passiert ist halt, dass die Dateien so wie sie dort abgelegt wurden, auch im classpath verfügbar gemacht werden.
Danke, jetzt funkts. Ich habe so etwas bereits in ANT gemacht, dort brauchts keinen solchen Odner. Mit MAVEN bin ich (noch) nicht sehr vertraut.
 

Ähnliche Java Themen


Oben