JavaFX: "Инструментарий" не инициализируется при попытке воспроизведения mp3 файла с помощью класса MediaPlayer

Я пытаюсь сделать простой mp3-плеер на фоне моей программы, используя следующее:

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

Файл intro.mp3 помещается в папку bin моего пакета вместе с другими .class файлами.

Проблема заключается в том, что моя программа завершается:

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)

У кого-нибудь есть идеи в зависимости от причины проблемы?

Ответ 1

JavaFX выполняет "скрытую" инициализацию при запуске. Выполнение MediaPlayer не инициирует инициализацию.

Самые простые способы его запуска:

  • выполнено Application.launch()
  • существует программа на основе Application, запущенная из jar, упакованной с помощью fx ant задач (например, построенная из проекта Netbeans JavaFX)
  • начали JFXPanel

Ответ 2

Чтобы избежать инициализации Exception, вам нужно либо вызвать метод Application.launch(), либо просто создать экземпляр нового класса JFXPanel() (даже если он не используется для чего-либо).. При запуске приложения инициируется JavaFxRuntime.

Чтобы создать экземпляр JFXPanel, добавьте строку ниже в свой код

 final JFXPanel fxPanel = new JFXPanel();

Импортировать следующий пакет

import javafx.embed.swing.JFXPanel;

Ответ 3

Также можно явно инициализировать инструментарий, вызвав: com.sun.javafx.application.PlatformImpl#startup(Runnable)

Немного взломанный, из-за использования * Impl, но полезен, если вы не хотите использовать Application или JXFPanel по какой-либо причине.