为了账号安全,请及时绑定邮箱和手机立即绑定

使用 JavaFX 从 jar 播放声音时出现 java.lang.NoClassDef

使用 JavaFX 从 jar 播放声音时出现 java.lang.NoClassDef

30秒到达战场 2023-03-02 09:51:47
我希望能够播放 mp3 文件中的声音,我看到了推荐使用 JavaFX 的帖子。我实现了 MediaPlayer 并初始化了 JFXPanel,在 eclipse 中,一切都很好。然而,当我导出到一个可运行的 jar 并尝试运行该程序时,我收到以下错误消息:java.lang.NoClassDefFoundError: javafx/scene/media/MediaException。我认为这是由于在较新的 JRE 版本中排除了 JavaFX(这是我在搜索解决方案时遇到的)。我的主要问题是如何使用 JavaFX 发送 jar?我是否必须包括一个罐子,如果是,我从哪里得到它?因为如果我没记错的话,eclipse 似乎不会将 JavaFX 打包到我的可运行程序中。这里有一个例子,对我来说,已经触发了这种行为:// This would throw a java.lang.NoClassDefFoundError for the JFXPanel but is effectively the same problempublic 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();    }}感谢您的帮助!
查看完整描述

2 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

JavaFx 被移除到 JDK> = 11 中,现在是一个单独的项目 opensurse [openjfx] ( https://openjfx.io/ )。现在创建一个可在任何地方运行的应用程序 javafx 版本变得更加困难,但它是一个不断发展的过程,我认为这是很好的文档 [doc-image-live] ( https://openjfx.io/ openjfx-docs/#modular)。


我在开发 JDK 1.8 时遇到了类似的问题,但在我的版本 java 系统中是 openjdk11,我认为这是相同的情况。


您的示例是错误的,因为它不是 JavaFX 应用程序。JavaFX 应用程序必须扩展javafx.application.Application并在主调用方法launch ,该方法将调用从 Application 继承的方法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版本


查看完整回答
反对 回复 2023-03-02
?
Qyouu

TA贡献1786条经验 获得超11个赞

如果您不想使用 JavaFX,另一种方法是使用源自 JavaZOOM 的库来完成读取 mp3 文件的任务。我在 github 上看到许多源自此来源的产品,例如https://github.com/goxr3plus/java-sound-libraries但我自己并没有使用过这个特定的库。

我的偏好是将用于 GUI 的 JavaFX 与 javax.audio.sampled 以及我构建的依赖于 java.sound.sampled.SourceDataLine 输出的库相结合。但我从来没有费心去实施阅读 mp3。在使用压缩音频资源时,我倾向于采用 ogg/vorbis 路线。


查看完整回答
反对 回复 2023-03-02
  • 2 回答
  • 0 关注
  • 161 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信