JavaFX: "Toolkit" не инициализируется при попытке воспроизведения 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)

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

4 ответа

Решение

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

Самые простые способы вызвать это:

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

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

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

 final JFXPanel fxPanel = new JFXPanel();

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

import javafx.embed.swing.JFXPanel;

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

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

Другие вопросы по тегам