¿Reproducir audio usando JavaFX MediaPlayer en una aplicación Java normal?

Necesito poder reproducir archivos de audio (MP3 / Wav) en un proyecto Java normal. Preferiría usar el nuevo JavaFX MediaPlayer en lugar de JMF. Escribí un código para probar esto:

public void play() { URL thing = getClass().getResource("mysound.wav"); Media audioFile = new Media( thing.toString() ); try { MediaPlayer player = new MediaPlayer(audioFile); player.play(); } catch (Exception e) { System.out.println( e.getMessage() ); System.exit(0); } } 

Cuando ejecuto esto, obtengo la excepción: Toolkit no se inicializó

Entiendo que esto tiene algo que ver con el hilo de JavaFX. Mi pregunta es, ¿cómo puedo resolver esto? ¿Necesito crear un Panel JavaFX solo para reproducir algunos archivos de audio en el fondo de mi aplicación normal, o hay alguna otra manera?

Editar: Stacktrace:

 java.lang.IllegalStateException: Toolkit not initialized at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:121) at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:116) at javafx.application.Platform.runLater(Platform.java:52) at javafx.scene.media.MediaPlayer.init(MediaPlayer.java:445) at javafx.scene.media.MediaPlayer.(MediaPlayer.java:360) at javaapplication6.JavaApplication6.play(JavaApplication6.java:23) at javaapplication6.JavaApplication6.main(JavaApplication6.java:14) 

Utilice un JFXPanel y tenga cuidado de usar solo objetos JavaFX en el hilo JavaFX y después de que el sistema JavaFX se haya inicializado correctamente.

JavaFX es Java normal, lo que hace que la pregunta sea un poco confusa, pero supongo que te refieres a Swing.

Aquí hay un reproductor de audio de muestra desde el cual se lanza. La muestra asume que hay un montón de archivos mp3 en la carpeta de música de muestra pública predeterminada para Windows 7 (C: \ Users \ Public \ Music \ Sample Music) y reproduce cada archivo uno por uno.

 import java.io.*; import java.util.*; import javafx.application.Platform; import javafx.beans.value.*; import javafx.embed.swing.JFXPanel; import javafx.event.*; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.*; import javafx.scene.layout.*; import javafx.scene.media.*; import javafx.util.Duration; import javax.swing.*; /** Example of playing all mp3 audio files in a given directory * using a JavaFX MediaView launched from Swing */ public class JavaFXVideoPlayerLaunchedFromSwing { private static void initAndShowGUI() { // This method is invoked on Swing thread JFrame frame = new JFrame("FX"); final JFXPanel fxPanel = new JFXPanel(); frame.add(fxPanel); frame.setBounds(200, 100, 800, 250); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); frame.setVisible(true); Platform.runLater(new Runnable() { @Override public void run() { initFX(fxPanel); } }); } private static void initFX(JFXPanel fxPanel) { // This method is invoked on JavaFX thread Scene scene = new SceneGenerator().createScene(); fxPanel.setScene(scene); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { initAndShowGUI(); } }); } } class SceneGenerator { final Label currentlyPlaying = new Label(); final ProgressBar progress = new ProgressBar(); private ChangeListener progressChangeListener; public Scene createScene() { final StackPane layout = new StackPane(); // determine the source directory for the playlist final File dir = new File("C:\\Users\\Public\\Music\\Sample Music"); if (!dir.exists() || !dir.isDirectory()) { System.out.println("Cannot find video source directory: " + dir); Platform.exit(); return null; } // create some media players. final List players = new ArrayList(); for (String file : dir.list(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.endsWith(".mp3"); } })) players.add(createPlayer("file:///" + (dir + "\\" + file).replace("\\", "/").replaceAll(" ", "%20"))); if (players.isEmpty()) { System.out.println("No audio found in " + dir); Platform.exit(); return null; } // create a view to show the mediaplayers. final MediaView mediaView = new MediaView(players.get(0)); final Button skip = new Button("Skip"); final Button play = new Button("Pause"); // play each audio file in turn. for (int i = 0; i < players.size(); i++) { final MediaPlayer player = players.get(i); final MediaPlayer nextPlayer = players.get((i + 1) % players.size()); player.setOnEndOfMedia(new Runnable() { @Override public void run() { player.currentTimeProperty().removeListener(progressChangeListener); mediaView.setMediaPlayer(nextPlayer); nextPlayer.play(); } }); } // allow the user to skip a track. skip.setOnAction(new EventHandler() { @Override public void handle(ActionEvent actionEvent) { final MediaPlayer curPlayer = mediaView.getMediaPlayer(); MediaPlayer nextPlayer = players.get((players.indexOf(curPlayer) + 1) % players.size()); mediaView.setMediaPlayer(nextPlayer); curPlayer.currentTimeProperty().removeListener(progressChangeListener); curPlayer.stop(); nextPlayer.play(); } }); // allow the user to play or pause a track. play.setOnAction(new EventHandler() { @Override public void handle(ActionEvent actionEvent) { if ("Pause".equals(play.getText())) { mediaView.getMediaPlayer().pause(); play.setText("Play"); } else { mediaView.getMediaPlayer().play(); play.setText("Pause"); } } }); // display the name of the currently playing track. mediaView.mediaPlayerProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observableValue, MediaPlayer oldPlayer, MediaPlayer newPlayer) { setCurrentlyPlaying(newPlayer); } }); // start playing the first track. mediaView.setMediaPlayer(players.get(0)); mediaView.getMediaPlayer().play(); setCurrentlyPlaying(mediaView.getMediaPlayer()); // silly invisible button used as a template to get the actual preferred size of the Pause button. Button invisiblePause = new Button("Pause"); invisiblePause.setVisible(false); play.prefHeightProperty().bind(invisiblePause.heightProperty()); play.prefWidthProperty().bind(invisiblePause.widthProperty()); // layout the scene. layout.setStyle("-fx-background-color: cornsilk; -fx-font-size: 20; -fx-padding: 20; -fx-alignment: center;"); layout.getChildren().addAll( invisiblePause, VBoxBuilder.create().spacing(10).alignment(Pos.CENTER).children( currentlyPlaying, mediaView, HBoxBuilder.create().spacing(10).alignment(Pos.CENTER).children(skip, play, progress).build() ).build() ); progress.setMaxWidth(Double.MAX_VALUE); HBox.setHgrow(progress, Priority.ALWAYS); return new Scene(layout, 800, 600); } /** sets the currently playing label to the label of the new media player and updates the progress monitor. */ private void setCurrentlyPlaying(final MediaPlayer newPlayer) { progress.setProgress(0); progressChangeListener = new ChangeListener() { @Override public void changed(ObservableValue observableValue, Duration oldValue, Duration newValue) { progress.setProgress(1.0 * newPlayer.getCurrentTime().toMillis() / newPlayer.getTotalDuration().toMillis()); } }; newPlayer.currentTimeProperty().addListener(progressChangeListener); String source = newPlayer.getMedia().getSource(); source = source.substring(0, source.length() - ".mp4".length()); source = source.substring(source.lastIndexOf("/") + 1).replaceAll("%20", " "); currentlyPlaying.setText("Now Playing: " + source); } /** @return a MediaPlayer for the given source which will report any errors it encounters */ private MediaPlayer createPlayer(String aMediaSrc) { System.out.println("Creating player for: " + aMediaSrc); final MediaPlayer player = new MediaPlayer(new Media(aMediaSrc)); player.setOnError(new Runnable() { @Override public void run() { System.out.println("Media error occurred: " + player.getError()); } }); return player; } } 

¿Mi archivo .JAR creado a través de swing automáticamente tendrá JavaFX agregado una vez que lo agregue a las bibliotecas en netbeans?

Técnicamente, Swing no construye archivos Jar pero sí lo hace el jar de los comandos javafx packaging.

Si su aplicación contiene JavaFX, entonces, es mejor usar las herramientas de empaque JavaFX . Sin ellos, es posible que tenga problemas de implementación, ya que el jar del tiempo de ejecución de Java (jfxrt.jar) no está automáticamente en el classpath de arranque java para jdk7u7. Los usuarios pueden agregarlo manualmente a su classpath en tiempo de ejecución, pero podría ser un poco molesto. En futuras versiones de jdk (quizás jdk7u10 o jdk8), jfxrt.jar estará en classpath. Incluso entonces, el uso de las herramientas de empaque JavaFX aún sería recomendable ya que será la mejor manera de garantizar que su paquete de implementación funcione de la manera más compatible.

El proyecto SwingInterop NetBeans es un proyecto de muestra de NetBeans que utiliza herramientas de implementación de JavaFX para un proyecto de Swing que incorpora componentes de JavaFX. Fuente para SwingInterop es parte de la descarga de Demostraciones y Muestras JDK 7 y JavaFX .