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演示和示例下载的一部分.