我正在使用 JavaFX 开发应用程序,但在主菜单中播放背景音乐时遇到了严重问题。当我尝试创建一个新的媒体对象时,applicationc 崩溃了,我不知道为什么。
我以为程序找不到文件,但它可以。如果我通过 File 类检查文件是否存在,它会说存在!我按照官方 JavaFX 20 documentation 正确地为媒体对象提供了文件路径(至少我认为我是)。 MP3 没有损坏,我可以通过 VLC 播放它。我将 Eclipse IDE 与 JavaFX 20 和 Java 20 一起使用。
这是我得到的错误。
Exception in Application start method
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:119)
at java.base/java.lang.reflect.Method.invoke(Method.java:578)
at [email protected]/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464)
at [email protected]/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:578)
at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1081)
Caused by: java.lang.RuntimeException: Exception in Application start method
at [email protected]/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:893)
at [email protected]/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
at java.base/java.lang.Thread.run(Thread.java:1623)
Caused by: javafx.fxml.LoadException:
/C:/Users/jo/Desktop/Java/eclipse-workspace/Example/src/main/views/MainMenu.fxml
at [email protected]/javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2722)
at [email protected]/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2692)
at [email protected]/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2563)
at [email protected]/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3376)
at [email protected]/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3332)
at [email protected]/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3300)
at [email protected]/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3272)
at [email protected]/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3248)
at [email protected]/javafx.fxml.FXMLLoader.load(FXMLLoader.java:3241)
at main.Main.start(Main.java:18)
at [email protected]/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:839)
at [email protected]/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:483)
at [email protected]/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:456)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
at [email protected]/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:455)
at [email protected]/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at [email protected]/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at [email protected]/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:185)
... 1 more
Caused by: java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:119)
at java.base/java.lang.reflect.Method.invoke(Method.java:578)
at com.sun.javafx.reflect.Trampoline.invoke(MethodUtil.java:72)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:578)
at [email protected]/com.sun.javafx.reflect.MethodUtil.invoke(MethodUtil.java:270)
at [email protected]/com.sun.javafx.fxml.MethodHelper.invoke(MethodHelper.java:84)
at [email protected]/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2688)
... 17 more
Caused by: java.lang.IllegalAccessError: class com.sun.media.jfxmediaimpl.NativeMediaManager (in unnamed module @0x1314f17) 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 @0x1314f17
at com.sun.media.jfxmediaimpl.NativeMediaManager.lambda$new$0(NativeMediaManager.java:110)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:571)
at com.sun.media.jfxmediaimpl.NativeMediaManager.<init>(NativeMediaManager.java:107)
at com.sun.media.jfxmediaimpl.NativeMediaManager$NativeMediaManagerInitializer.<clinit>(NativeMediaManager.java:77)
at com.sun.media.jfxmediaimpl.NativeMediaManager.getDefaultInstance(NativeMediaManager.java:89)
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:392)
at main.controllers.MainMenuController.music(MainMenuController.java:15)
at main.controllers.MainMenuController.initialize(MainMenuController.java:11)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
... 24 more
Exception running application main.Main
可重现的例子:
Main.java
package main;
import java.io.File;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Main extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage arg0) throws Exception {
Parent root = FXMLLoader.load(new File("src/main/views/MainMenu.fxml").toURI().toURL());
Scene scene = new Scene(root);
arg0.setFullScreen(true);
arg0.setScene(scene);
arg0.show();
}
}
主菜单.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.BorderPane?>
<BorderPane xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/19" fx:controller="main.controllers.MainMenuController">
<!-- TODO Add Nodes -->
</BorderPane>
MainMenuController.java
package main.controllers;
import java.io.File;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.util.Duration;
public class MainMenuController {
public void initialize() {
music();
}
public void music() {
Media media = new Media(new File("src/main/resources/mainmenu.mp3").toURI().toString());
MediaPlayer mp = new MediaPlayer(media);
mp.setOnEndOfMedia(new Runnable() {
@Override
public void run() {
mp.seek(Duration.ZERO);
}
});
mp.setVolume(1);
mp.play();
}
}
文件夹结构:
.
└── src/
├── main/
│ ├── controllers/
│ │ └── MainMenuController.java
│ ├── views/
│ │ └── MainMenu.fxml
│ └── resources/
│ └── mainmenu.mp3
└── Main.java
非常感谢任何帮助。