在普通的Java应用程序中使用JavaFX MediaPlayer播放音频?

Cli*_*ote 8 java audio javafx-2

我需要能够在普通的Java项目中播放音频文件(MP3/Wav).我更喜欢使用新的JavaFX MediaPlayer而不是JMF.我写了一些代码来测试这个:

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);
    }        
}
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我得到了异常:Toolkit未初始化

我知道这与JavaFX线程有关.我的问题是,我该如何解决这个问题?我是否需要创建一个JavaFX Panel才能在我的普通应用程序的后台播放一些音频文件,或者还有其他方法吗?

编辑: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.<init>(MediaPlayer.java:360)
    at javaapplication6.JavaApplication6.play(JavaApplication6.java:23)
    at javaapplication6.JavaApplication6.main(JavaApplication6.java:14)
Run Code Online (Sandbox Code Playgroud)

jew*_*sea 17

使用JFXPanel并小心只在JavaFX线程上使用JavaFX对象,并在JavaFX系统正确初始化之后.

JavaFX是普通的Java,这使得这个问题有点令人困惑,但我想你的意思是Swing.

这是一个从中发布的示例音频播放器.该示例假定Windows 7的默认公共示例音乐文件夹(C:\ Users\Public\Music\Sample Music)中有一堆mp3文件,并依次播放每个文件.

import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Scene;

import javax.swing.*;

/**
 * Example of playing all mp3 audio files in a given directory
 * using a JavaFX MediaView launched from Swing
 */
public class JavaFXMediaPlayerLaunchedFromSwing {
    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(() -> initFX(fxPanel));
    }

    private static void initFX(JFXPanel fxPanel) {
        // This method is invoked on JavaFX thread
        Scene scene = new MediaSceneGenerator().createScene();
        fxPanel.setScene(scene);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(
            JavaFXMediaPlayerLaunchedFromSwing::initAndShowGUI
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

我将通过swing构建的.JAR文件自动添加到JavaFX中,一旦我将其添加到netbeans中的库中吗?

从技术上讲,Swing不会构建Jar文件,但javafx包装命令的jar会这样做.

如果您的应用程序包含JavaFX,那么最好使用JavaFX打包工具.没有它们,您可能会遇到一些部署问题,因为Java运行时jar(jfxrt.jar)不会自动出现在jdk7u7的java引导类路径中.用户可以手动将其添加到运行时类路径中,但这可能有点痛苦.在将来的jdk版本(可能是jdk7u10或jdk8)中,jfxrt.jar将位于类路径中.即便如此,仍然建议使用JavaFX打包工具,因为这将是确保您的部署包以最兼容的方式工作的最佳方法.

该SwingInterop NetBeans项目是一个示例NetBeans项目,它利用JavaFX的部署工具,适用于秋千项目嵌入JavaFX组件.SwingInterop的源代码是JDK 7和JavaFX演示和示例下载的一部分.