我正在用Java编写游戏,所以我决定向其中添加音乐。我尝试使用以下代码:

URL resource = getClass().getResource("music.mp3");
     MediaPlayer a = new MediaPlayer(new Media(resource.toString()));
     a.setOnEndOfMedia(new Runnable() {
           public void run() {
             a.seek(Duration.ZERO);
           }
       });
      a.play();


但是由于某种原因,我得到了这个错误:

https://pastebin.com/UPkTbWHh

music.mp3文件与我正在运行该文件的类位于同一文件夹中,并且代码在tick()方法中运行。有人对我该如何解决这个问题有想法吗?

谢谢,卢卡斯

最佳答案

您正在尝试从JavaFX应用程序的上下文外部执行上述代码。 MediaPlayer是JavaFX组件,因此依赖于正在初始化的工具包,您(默认情况下)不能随意旋转JFX组件。

“正确”的方法是将JFX Application子类化,然后从那里启动您的应用程序,这将正确地初始化JFX平台。

“黑客”方式是在Swing EDT中运行以下代码行:

new JFXPanel();


...这也会带来初始化JFX工具包的副作用,并允许您创建其他JFX组件。

正如评论中指出的那样,由于Java 9,您可以使用以下更简单的方法:

Platform.startup(() -> {
    //Code to run on JFX thread
});

09-05 09:09