web-dev-qa-db-fra.com

JavaFX: "Toolkit" non initialisé lors de la tentative de lecture d'un fichier mp3 via la classe MediaPlayer

J'essaie de faire une lecture mp3 simple en arrière-plan de mon programme en utilisant ce qui suit:

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

Le fichier intro.mp3 est placé dans le dossier bin de mon package, avec les autres fichiers .class.

Le problème est que mon programme se termine avec:

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

Le journal de terminaison complet est:

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)

Quelqu'un a des idées sur la cause du problème?

27
Dimitris Sfounis

JavaFX effectue l'initialisation "cachée" au démarrage. L'exécution de MediaPlayer ne déclenche pas l'initialisation.

Les moyens les plus simples de le déclencher sont:

  • avoir Application.launch() exécutée
  • avoir un programme basé sur Application exécuté à partir d'un fichier jar empaqueté par fx tâches ant (par exemple construit à partir du projet JavaFX de Netbeans)
  • avoir JFXPanel démarré
  • appel Platform.startup(Runnable) (Java 9+)
25
Sergey Grinev

Pour éviter l'exception d'initialisation, vous devez invoquer la méthode Application.launch () ou simplement instancier une nouvelle classe JFXPanel ()(même si elle n'est pas utilisée pour quoi que ce soit). Cela lancera JavaFxRuntime au démarrage de l'application

Pour instancier JFXPanel, ajoutez la ligne ci-dessous dans votre code

 final JFXPanel fxPanel = new JFXPanel();

Importer le package suivant

import javafx.embed.swing.JFXPanel;
14
Sagar Damani

Il existe également un moyen d'initialiser explicitement la boîte à outils en appelant: com.Sun.javafx.application.PlatformImpl#startup(Runnable)

Un peu hacky, en raison de l'utilisation de * Impl, mais est utile si vous ne voulez pas utiliser Application ou JXFPanel pour une raison quelconque.

3
krzychek
0
Wolfgang Fahl