我希望能够播放mp3文件中的声音,为此我看到了一些推荐使用JavaFX的帖子。我实现了MediaPlayer并初始化了JFXPanel,在eclipse中,一切正常。
但是,当我导出到可运行的jar并尝试运行该程序时,出现以下错误消息:java.lang.NoClassDefFoundError:javafx / scene / media / MediaException。
我认为这是由于在新的JRE版本中排除了JavaFX(我在搜索解决方案时遇到的)。我的主要问题是如何使用JavaFX运送罐子?我必须包括一个罐子吗?如果是,我从哪里得到它?因为如果我没记错的话,eclipse似乎并没有将JavaFX打包到我的runnable中。
对于我来说,这是一个已经触发此行为的示例:
// This would throw a java.lang.NoClassDefFoundError for the JFXPanel but is effectively the same problem
public class Test extends Application
{
public static void main(String[] Args)
{
launch(Args);
}
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Hello World!");
StackPane root = new StackPane();
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
}
}
谢谢您的帮助!
答案 0 :(得分:2)
JavaFx已移至JDK> = 11,现在是一个单独的项目opensurse [openjfx](https://openjfx.io/)。 现在要在任何地方创建可运行的应用程序javafx版本变得更加困难,但这是一个持续的发展,我认为这是很好的文档[doc-image-live](https://openjfx.io/openjfx-docs/#modular)。 / p>
当我用于开发JDK 1.8时,我遇到了类似的问题,但是在我的版本中,java系统是openjdk11,我认为情况是一样的。
您的示例是错误的,因为不是JavaFX应用程序。 JavaFX应用程序必须扩展 javafx.application.Application ,并在主调用方法 launch 中,该方法将调用从继承的方法 start 申请。
这是Oracle的简单示例
public class HelloWorld extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Hello World!");
Button btn = new Button();
btn.setText("Say 'Hello World'");
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Hello World!");
}
});
StackPane root = new StackPane();
root.getChildren().add(btn);
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
}
}
ps:当您讲javafx时,必须添加Java版本,因为我们不知道您的Java版本
答案 1 :(得分:0)
如果您不想使用JavaFX,则另一种方法是利用源自JavaZOOM的库来读取mp3文件。我看到github上有许多源于此资源的产品,例如https://github.com/goxr3plus/java-sound-libraries,但我自己并未使用此特定的库。
我的首选是将GUI的JavaFX与javax.audio.sampled以及我构建的依赖于java.sound.sampled.SourceDataLine的库相结合。但是我从不费心去实现阅读mp3。使用压缩音频资源时,我倾向于采用ogg / vorbis路线。