JavaFX Image wird nicht korrekt geladen

Naxon89

Mitglied
Hallo zusammen,

ich möchte gerne für mein Center ein Background Picture zu meiner AnchorPane hinzufügen. Dazu habe ich folgenden Code gefunden:

Code:
   @Override
   public Pane getPane() {

       AnchorPane ap = new AnchorPane();
       Label l = new Label();
       try{
           InputStream is =  new FileInputStream("./pic/blue.jpg");
           InputStreamReader ir = new InputStreamReader(is);
       }catch(IOException ioe){
           System.out.println("Es ist folgender Fehler aufgetreten: " + ioe.getMessage());
       }
       
       try {
           Image img = new Image("./pic/blue.png");
           BackgroundSize backgroundSize = new BackgroundSize(100, 100, true, true, true, false);
           BackgroundImage backgroundImage = new BackgroundImage(img, BackgroundRepeat.REPEAT, BackgroundRepeat.NO_REPEAT, BackgroundPosition.CENTER, backgroundSize);
           Background background = new Background(backgroundImage);
           ap.setBackground(background);
       } catch (Exception e) {
           System.out.println("Nope");
       }
       
       
       
       l.setText("Center");
       ap.getChildren().add(l);
       return ap;

   }

Kurze Erklärung meines Codes:

Zunächst habe ich eine AnchorPane erstellt, die zum Schluss zurückgebe (Die wird hinterher in eine BorderPane eingebunden.). Das Label habe ich zu Testzwecken eingebunden. Ebenfalls zu Testzwecken habe ich den InputStream eingebaut, um zu schauen, ob das Image überhaupt gefunden wird (Dies klappt ohne Probleme).

Da ich ein Image einbinden möchte, habe ich hier ein Screen von Ordnerstruktur meines Projekts:
Ordner.PNG

Mein Problem:
Der Complier wirft mir bei "Image img = new Image("./pic/blue.png");" (Zeile 40) folgende Exception:

Code:
Exception in Application start method
java.lang.reflect.InvocationTargetException
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
   at java.lang.reflect.Method.invoke(Unknown Source)
   at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
   at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
   at java.lang.reflect.Method.invoke(Unknown Source)
   at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application start method
   at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
   at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182)
   at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalArgumentException: Invalid URL: Invalid URL or resource not found
   at javafx.scene.image.Image.validateUrl(Image.java:1118)
   at javafx.scene.image.Image.<init>(Image.java:620)
   at GUI.Center.getPane(Center.java:40)
   at GUI.MainScene.getScene(MainScene.java:34)
   at Program.Main.start(Main.java:18)
   at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
   at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
   at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
   at java.security.AccessController.doPrivileged(Native Method)
   at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
   at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
   at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
   at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
   ... 1 more
Caused by: java.lang.IllegalArgumentException: Invalid URL or resource not found
   at javafx.scene.image.Image.validateUrl(Image.java:1110)
   ... 13 more
Exception running application Program.Main

Kann mir einer einen Tipp geben, wie ich das Problem lösen kann?

Viele Grüße und Glückauf aus dem Pott

Naxon89
 
Am besten erstellst du einen Ordner Resources, in dem du deine Bilder ablegst und dann via
Code:
getClassResources ("...")

Der Pfad, den du angibst, ist falsch. Ich kann jetzt zwar nicht erkennen, aus welcher Klasse du das Bild laden willst, Aber der Punkt gibt an, dass du aus dem aktuellen Pfad anfängst zu suchen, also gehst du davon aus, dass der Ordner pic da liegt, wo deine Java-Klassen sind.
 
Vielen Dank, Kababär für deine Antwort. Ich werde mal meine Ordnersturktur überarbeiten.

Ich habe derweil noch weiter nach einer Lösung gesucht und bin auf folgendes gestoßen:

Code:
    public Pane getPane() {

       AnchorPane ap = new AnchorPane();
       Label l = new Label();
       Image image = new Image("file:Resources/blue.png");
       ImageView iv = new ImageView();
       iv.setImage(image);
       ap.getChildren().add(iv);
       
       
       l.setText("Center");
       ap.getChildren().add(l);
       return ap;

   }

Mir war nicht bewusst, dass man der Klasse "Image()" sagen, es handelt sich um ein File.

Hier ist die Quelle, aus der ich meine Lösung "gebastelt" habe: JavaFX Tutorial part8 How to use image
 
Kommt halt drauf an, wo das Bild liegt: Liegt es im Filesystem, ist "file://..." sicher ein richtiger Weg. Man kann aber dann auch new File("<path>").toURI().toURL() verwenden. Oder wenn das File im Classpath (z.B. als Teil des gebauten JAR-Files), dem Beispiel von @Kababär folgen.
 

Neue Themen


Zurück
Oben