JavaFX:通过MediaPlayer类播放mp3文件时,“Toolkit”未初始化

30

我正在尝试使用以下内容在我的程序后台播放简单的mp3:

Media med = new Media(getClass().getResource("intro.mp3").toExternalForm());
MediaPlayer mPlayer = new MediaPlayer(med);
mPlayer.play();

intro.mp3文件与其他.class文件一起位于我的软件包的bin文件夹中。

问题是我的程序终止并显示:

Exception in thread "main" java.lang.IllegalStateException: Toolkit not initialized

完整的终止日志如下:

Device "Intel(R) HD Graphics Family" (\\.\DISPLAY1) initialization failed : 
WARNING: bad driver version detected, device disabled. Please update your driver to at least version 8.15.10.2302

Exception in thread "main" java.lang.IllegalStateException: Toolkit not initialized
    at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:153)
    at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:148)
    at javafx.application.Platform.runLater(Platform.java:52)
    at javafx.scene.media.MediaPlayer.init(MediaPlayer.java:450)
    at javafx.scene.media.MediaPlayer.<init>(MediaPlayer.java:365)
    at PokerApp.<init>(PokerApp.java:33)
    at PokerApp.main(PokerApp.java:105)

有人对问题的原因有任何想法吗?

4个回答

28

JavaFX在启动时执行“隐藏”的初始化。运行MediaPlayer不会触发初始化。

触发它的最简单方法是:


1
如果我回家后它能正常工作,我会尝试并将该问题标记为正确答案。 Sergey先生,祝您圣诞快乐,并感谢您在我的两个问题中提供的答案。 - Dimitris Sfounis
1
我在构造函数中放置了一个单独的JFXPanel fxPanel = new JFXPanel();,一切都很顺利。当我在使用JavaFX和SWING时,是否建议我使用JFXPanel而不是JPanel或Container? - Dimitris Sfounis
你只能将FX节点放入JFXPanel中,因此如果您想要具有JavaFX功能的Swing应用程序,强烈建议使用它。 - Sergey Grinev
如果我在无头模式下运行,我该怎么办? - Ruraj
我认为JavaFX不支持无头模式。 - Sergey Grinev

15

为避免初始化异常,您需要调用 Application.launch() 方法或者简单地实例化一个新的 JFXPanel()(即使它没有用于任何操作)。 这将在应用程序启动时初始化 JavaFxRuntime

要实例化JFXPanel,请在您的代码中添加以下行

 final JFXPanel fxPanel = new JFXPanel();

导入以下包

import javafx.embed.swing.JFXPanel;

5

还有一种显式初始化工具包的方法,可以调用以下方法:com.sun.javafx.application.PlatformImpl#startup(Runnable)

这种方法有点hacky,因为使用了*Impl,但如果出于某些原因不想使用ApplicationJXFPanel,这是很有用的。


3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接