Javafx getResource-Pfad wird nicht erkannt

Spiderpic98

Mitglied
Guten Tag,

ich habe ein Problem mit dem Pfad den ich versuche zu erstellen. Ich habe mehrere Lösungen im Internet gefunden,
jedoch haben die mein Problem nicht gelöst.
Hier sieht man einmal was ich versuche. Ich habe mit System.out.printIn()versucht den Ort des Problems finden.
Auch bei anderen Sachen, zum Beispiel mit Bildern wird der Pfad nicht anerkannt. Die Datei ist im selben Ordner wie die Klasse welche das ausführen soll.
Java:
System.out.println("1");
        Media backgroundMusic = new Media(getClass().getResource("Sonata.mp3").toExternalForm());
        System.out.println("2");
        MediaPlayer player = new MediaPlayer(backgroundMusic);
        System.out.println("3");
        player.setCycleCount(player.INDEFINITE);
        System.out.println("4");
        player.play();

Ich habe es auch so versucht, aber das ändert nichts.

Code:
Media backgroundMusic = new Media(getClass().getResource("file:///home/usr/Downloads/Sonata.mp3").toExternalForm());

Ich kenne mich leider nicht gut genug mit Java bzw. in dem Fall mit Javafx aus, als das ich verstehe was das Problem ist. Ich hoffe ihr könnt mir weiterhelfen.
HIer ist noch einmal die Fehlermeldung die mir ausgegeben wird:

Java:
1
Exception in Application start method
java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at javafx.graphics@18.0.1/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:465)
    at javafx.graphics@18.0.1/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:364)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at javafx.graphics@18.0.1/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:901)
    at javafx.graphics@18.0.1/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:196)
    at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.lang.IllegalAccessError: class com.sun.media.jfxmediaimpl.NativeMediaManager (in unnamed module @0x7ef86927) cannot access class com.sun.glass.utils.NativeLibLoader (in module javafx.graphics) because module javafx.graphics does not export com.sun.glass.utils to unnamed module @0x7ef86927
    at com.sun.media.jfxmediaimpl.NativeMediaManager.lambda$new$0(NativeMediaManager.java:138)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at com.sun.media.jfxmediaimpl.NativeMediaManager.<init>(NativeMediaManager.java:108)
    at com.sun.media.jfxmediaimpl.NativeMediaManager$NativeMediaManagerInitializer.<clinit>(NativeMediaManager.java:78)
    at com.sun.media.jfxmediaimpl.NativeMediaManager.getDefaultInstance(NativeMediaManager.java:90)
    at com.sun.media.jfxmedia.MediaManager.canPlayProtocol(MediaManager.java:78)
    at com.sun.media.jfxmedia.locator.Locator.<init>(Locator.java:240)
    at javafx.scene.media.Media.<init>(Media.java:393)
    at Menu.Credits.CreditFrame.start(CreditFrame.java:40)
    at javafx.graphics@18.0.1/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:847)
    at javafx.graphics@18.0.1/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:484)
    at javafx.graphics@18.0.1/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at javafx.graphics@18.0.1/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456)
    at javafx.graphics@18.0.1/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
    at javafx.graphics@18.0.1/com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
    at javafx.graphics@18.0.1/com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$11(GtkApplication.java:316)
    ... 1 more
Exception running application Menu.Credits.CreditFrame
/home/philipp/NetBeansProjects/Programmieren2/Prog2/nbproject/build-impl.xml:1341: The following error occurred while executing this line:
/home/philipp/NetBeansProjects/Programmieren2/Prog2/nbproject/build-impl.xml:936: Java returned: 1
 
1. ( eher unwahrscheinlich ) deine ressource muss genau in dem ordner liegen wo die klasse ist mit exakt dem namen nach dem du suchst

cannot access class com.sun.glass.utils.NativeLibLoader (in module javafx.graphics) because module javafx.graphics does not export com.sun.glass.utils to unnamed module
2. ( wahrscheinlicher ) dir scheint ein exports zu fehlen in deiner module info?
bzw du hast einen import versaubeutelt
 
1. ( eher unwahrscheinlich ) deine ressource muss genau in dem ordner liegen wo die klasse ist mit exakt dem namen nach dem du suchst


2. ( wahrscheinlicher ) dir scheint ein exports zu fehlen in deiner module info?
bzw du hast einen import versaubeutelt
1. das tut sie. Sie ist in dem gleichem Ordner.
2. Ich hatte mich über Modul Info dateien informiert. Aber ich habe dazu nur Zusammenhänge mit intellij gefunden und ich arbeite mit Netbeans. Und wenn ich eine Modul info Datei erstellen will, hat der keine ahnung was ich meine. Ich vermute mal das ich irgendwas falsch verstehe
 
Also das mit dem NetBeans nehme ich fast als Beleidigung. Als eingefleischter IntelliJ Fan kann ich so eine Aussage natürlich nicht auf mir sitzen lassen *SCNR*

Das Problem hier ist aber ganz klar das Java Modulsystem und der Fehler ist auch recht deutlich:
class com.sun.media.jfxmediaimpl.NativeMediaManager (in unnamed module @0x7ef86927) cannot access class com.sun.glass.utils.NativeLibLoader (in module javafx.graphics) because module javafx.graphics does not export com.sun.glass.utils to unnamed module @0x7ef86927
Das Problem ist aber kein fehlendes Exports im eigenen Code sondern hier geht es um den Zugriff der NativeMediaManager Klasse auf die JavaFX graphics Library. So ein Export kann man prinzipiell noch auf der Kommandozeile hinzufügen: --add-opens

Das ist aber aus meiner Sicht nicht wirklich die Lösung, aber es kann ggf. helfen, sowas einmal heraus zu finden. Also beim Aufruf einmal die Java Kommandozeilenoption --add-opens javafx.graphics/com.sun.glass.utils==ALL-UNNAMED hinzufügen.

Ansonsten wäre die wichtige Frage: Was hast Du für Abhängigkeiten? Welche Java Version nutzt Du? Welche JavaFX Abhängigkeiten hast Du?

Und was für ein Projekt hast Du genau gebaut? Hat NetBeans bei aktuellen Varianten das eigene NetBeans Java Projekt nicht raus geschmissen oder habe ich das falsch gelesen? Generell wäre meine Empfehlung, immer auf Maven (oder Gradle) zu setzen. Damit ist man von IDEs unabhängig und vor allem sind alle Projekteinstellungen über (ein oder zumindest ganz wenige) Textdateien verfügbar.
 
Das ist aber aus meiner Sicht nicht wirklich die Lösung, aber es kann ggf. helfen, sowas einmal heraus zu finden. Also beim Aufruf einmal die Java Kommandozeilenoption --add-opens javafx.graphics/com.sun.glass.utils==ALL-UNNAMED hinzufügen.
Die Option hatte ich bereits vorher eingefügt. Ändert nur nichts
Ansonsten wäre die wichtige Frage: Was hast Du für Abhängigkeiten? Welche Java Version nutzt Du? Welche JavaFX Abhängigkeiten hast Du?

Und was für ein Projekt hast Du genau gebaut? Hat NetBeans bei aktuellen Varianten das eigene NetBeans Java Projekt nicht raus geschmissen oder habe ich das falsch gelesen? Generell wäre meine Empfehlung, immer auf Maven (oder Gradle) zu setzen. Damit ist man von IDEs unabhängig und vor allem sind alle Projekteinstellungen über (ein oder zumindest ganz wenige) Textdateien verfügbar.
Hier sieht man einmal den Code der gesamten Klasse als Beispiel. Die Image Datei ist im gleichen Ordner wie die Klasse Anleitung. Jedoch bekomme ich die Fehlermeldung er würde es nicht finden und wenn ich den kompletten Pfad auf der Festplatte angebe kommen die bereits angesprochenen Fehler. Ich nutze aktuell jdk 11. Und das sollte ein ganz normales Java Projekt sein. Und ich bin mir nicht sicher was Sie mit Abhängigkeit meinen.

Java:
public class Anleitung extends Application{
   
   
   
    @Override
    public void start(Stage stage) throws Exception {
        Node forwards = new Label("Vorwärts");
        forwards.setTranslateX(0);
        forwards.setTranslateY(80);
        forwards.setStyle("-fx-text-fill:white;-fx-text-family: Verdana;");
     
        Node backwards = new Label("Rückwärts");
        backwards.setTranslateX(0);
        backwards.setTranslateY(300);
        backwards.setStyle("-fx-text-fill:white;");
       
        Node left = new Label("links");
        left.setTranslateX(0);
        left.setTranslateY(40);
        left.setStyle("-fx-text-fill:white;");
       
        Node right = new Label("rechts");
        right.setTranslateX(0);
        right.setTranslateY(0);
        right.setStyle("-fx-text-fill:white;");
       
        StackPane root = new StackPane();
        root.getChildren().add(forwards);
        root.getChildren().add(backwards);
        root.getChildren().add(left);
        root.getChildren().add(right);
        Scene scene = new Scene(root,300,300);
        Image img = new Image("CreditBackground.jpg");
            BackgroundImage bImg = new BackgroundImage(img,
                    BackgroundRepeat.NO_REPEAT,
                    BackgroundRepeat.NO_REPEAT,
                    BackgroundPosition.CENTER,
                    BackgroundSize.DEFAULT);
            Background bGround = new Background(bImg);
            root.setBackground(bGround);
        stage.setTitle("Tastensteuerung");
        stage.setScene(scene);
        stage.show();
       
       
       
       
       
       
    }
    public static void main(String[] args) {
        launch(args);
    }
   
}
 
Das passt so nicht zusammen. Bitte gib immer genau an:
- Was hast Du genau gemacht
- Was ist die genaue Fehlermeldung

Wenn Du das angegebene Modul / Paackage für alle unnamed Module geöffnet hättest, dann wäre die Fehlermeldung auf jeden Fall schon anders gewesen. Dann wäre zumindest nicht die Fehlermeldung gekommen, dass das Modul/Package nicht für ein unnamed Modul nicht geöffnet wäre. (Also entweder falsch angegeben weil es als Parameter für die Applikation und nicht als Parameter für die Java VM angegeben wurde oder die Fehlermeldung hätte sich geändert.)

Und Du schreibst eine JavaFX Anwendung. Also wirst Du irgendwie auch JavaFX im Projekt eingebunden haben. Das kann in Form eines JDKs erfolgt sein, bei dem es integriert ist oder Du hast es separat irgendwie eingebunden. Dann wäre interessant, welche Version Du wie eingebunden hast.

Ansonsten hast Du im Code jetzt kein Zugriff auf eine Ressource sondern einen Filezugriff:
Image img = new Image("CreditBackground.jpg");
Sprich: Es wird versucht, die Datei CreditBackground.jpg im aktuellen Arbeitsverzeichnis zu öffnen. Somit ist es gut möglich, dass jetzt ein anderer Fehler kommt, weil eben diese Datei nicht gefunden wurde. Hier wäre es zielführend, eine Ressource anzugeben, also sowas wie:
Image img = new Image(getClass().getResource("CreditBackground.jpg"));
 
Was auch sein kann: Du hast diverse Klassen auf dem Classpath aber nicht als Module hinzugefügt. javafx.media fehlt ggf. so dass ein --add-modules javafx.media helfen könnte. Aber das ist noch etwas herum geraten weil einfach zu wenig Informationen vorliegen. Und neben javafx.media sollten alle Module, die benötigt werden, hinzugefügt werden.

Evtl. ist https://openjfx.io/openjfx-docs/ hilfreich - da wird eigentlich alles beschrieben, was man einstellen muss bei den ganzen, diversen Wegen, wie man so ein JavaFX Projekt erstellen kann.
 

Neue Themen


Zurück
Oben