当前位置: 首页 > 知识库问答 >
问题:

Media类导致JavaFX崩溃[重复]

柴辰阳
2023-03-14

我已经在这个项目上工作了一段时间,不知道为什么Media类会导致我的应用程序在JavaFX(NetBeans)上崩溃。

在观看了几篇关于如何使用Media类的教程后,我想到了以下内容:

class CoinFall extends TimerTask {

    Pane pane;
    
    public void run() {
        Platform.runLater(()-> {
            CTimer animation=new CTimer();
            animation.setUP(pane);
            animation.start();
        });
    }
    
    public void setUP(Pane p) {
        pane=p;
    }
}

public class NewFXMain extends Application {
    Media media=new Media(new File("C:\\ProjectImages\\baby.mp3").toURI().toString());
    
    @Override
    public void start(Stage primaryStage) {
        final int SCENE_WIDTH=600, SCENE_HIGHT=600;
        final double GRAVITY=200, FORCE=200;
        Pane canvas=new Pane();
        Group root = new Group();
        
        Circle center = new Circle();
        center.setCenterX(300.0);
        center.setCenterY(300.0);
        center.setRadius(10.0);
        
        Line ground=new Line();
        ground.setStartX(0);
        ground.setStartY((SCENE_HIGHT/20)*19);
        ground.setEndX(SCENE_WIDTH);
        ground.setEndY((SCENE_HIGHT/20)*19);
        
        Button fireB=new Button();
        fireB.setLayoutX(450);
        fireB.setLayoutY(5);
        fireB.setText("Fire!");
        
        CoinFall cTask=new CoinFall();
        cTask.setUP(canvas);
        Timer cTimer=new Timer();
        cTimer.schedule(cTask, 0, 1000);
        
        CannonFall bTask=new CannonFall();
        bTask.setUP(canvas);
        Timer bTimer=new Timer();
        bTimer.schedule(bTask, 1000, 2000);
        
        fireB.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent e) {
                cTimer.cancel();
                bTimer.cancel();
            }
        });

        
        canvas.getChildren().add(center);
        canvas.getChildren().add(ground);
        canvas.getChildren().add(fireB);
        root.getChildren().add(canvas);
        
        Scene scene = new Scene(root, SCENE_WIDTH, SCENE_HIGHT);
        
        primaryStage.setTitle("Animation Testing Screen");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
    
}

如果我用Media类注释掉这行代码,那么代码就可以工作,但我想在背景中添加音乐。我知道,在此之后,我必须使用MediaPlayer类,并将媒体对象传递给它,然后调用play()方法,但由于某些原因,当它未被注释掉时,会产生以下错误:

Exception in Application constructor
java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:465)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:364)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1071)
Caused by: java.lang.RuntimeException: Unable to construct Application instance: class NewFXMain
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:891)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:196)
    at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.java:803)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:484)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456)
    at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184)
    ... 1 more
Caused by: java.lang.IllegalAccessError: class com.sun.media.jfxmediaimpl.NativeMediaManager (in unnamed module @0x7e50493c) cannot access class com.sun.glass.utils.NativeLibLoader (in module javafx.graphics) because module javafx.graphics does not export com.sun.glass.utils to unnamed module @0x7e50493c
    at com.sun.media.jfxmediaimpl.NativeMediaManager.lambda$new$0(NativeMediaManager.java:111)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:569)
    at com.sun.media.jfxmediaimpl.NativeMediaManager.<init>(NativeMediaManager.java:108)
    at com.sun.media.jfxmediaimpl.NativeMediaManager$NativeMediaManagerInitializer.<clinit>(NativeMediaManager.java:78)
    at com.sun.media.jfxmediaimpl.NativeMediaManager.getDefaultInstance(NativeMediaManager.java:90)
    at com.sun.media.jfxmedia.MediaManager.canPlayProtocol(MediaManager.java:78)
    at com.sun.media.jfxmedia.locator.Locator.<init>(Locator.java:240)
    at javafx.scene.media.Media.<init>(Media.java:393)
    at NewFXMain.<init>(NewFXMain.java:60)
    ... 14 more
Exception running application NewFXMain
C:\Users\User\AppData\Local\NetBeans\Cache\12.0\executor-snippets\run.xml:111: The following error occurred while executing this line:
C:\Users\User\AppData\Local\NetBeans\Cache\12.0\executor-snippets\run.xml:68: Java returned: 1
BUILD FAILED (total time: 0 seconds)

共有1个答案

楚俊逸
2023-03-14

从错误消息中可以看出,这是一个java平台模块访问问题:

because module javafx.graphics does not export com.sun.glass.utils to unnamed module. 

学习:

  • 了解Java 9模块

确保您已遵循openjfx中NetBeans中JavaFX的入门说明。我坚持到底。

另外,要理解javafx。media是一个单独的模块,所以无论您在哪里添加或需要其他JavaFX模块,都需要显式地包含它。

例如,如果您的应用程序是非模块化的(没有定义module-info.java)并且在Windows上运行,这似乎是您的问题中的情况,那么您需要定义适当的VM选项,如链接文档的“5.添加VM选项”部分所述:

--module-path "\path\to\javafx-sdk-17\lib" --add-modules javafx.controls,javafx.fxml,javafx.media

请注意,我将、javafx.media附加到--add-模块参数,以便媒体系统将作为模块加载,而不是从类路径加载。

从类路径而不是模块路径运行一些JavaFX框架代码(当不添加或不需要所需模块时发生),不是受支持的执行模式,并且是导致您错误的原因。

 类似资料:
  • 我需要使用两个线程将两个不同的字符附加到同一个JavaFX TextArea。我可以让一个工作,但是当我添加第二个线程时,它会因为一些很长的异常而中断。我做错了什么? 我研究了这个问题以寻求指导,它让我得到了一个线程工作,但不是两个:在两个独立的JavaFx TextArea中显示两个不同线程的输出

  • 我试图用LWJGL编写一个opengl渲染器。为了打开窗户,我用的是GLFW。但是,当我调用glfwCreateWindow时,它会崩溃,出现以下错误: Java运行时环境检测到一个致命错误: 谢了!

  • 问题内容: 我正在尝试创建一个node.js应用程序, 导致我的程序崩溃。节点说 ReferenceError:警报未定义 然后退出。我可以在常规html页面上运行javascript时使用该函数,因此我不知所措,这是为什么…这是我必须与node.js一起使用的单独模块吗? 问题答案: 该功能是浏览器对象的属性。它实际上不是JavaScript的一部分;它只是该环境中JavaScript代码可用的

  • 我正在使用内置于Web View的Android开发浏览器。其中我面临的一个问题是,当我访问http://crashmybrowser.com测试浏览器上的选项卡崩溃时,我的整个浏览器应用程序都会崩溃。但是,当在chrome或Opera上进行相同的测试时,这些浏览器会在崩溃中幸存下来,并且只有特定的选项卡崩溃是由于访问上述网站而预期的结果。有人能帮助理解我如何在使用Webview的浏览器上处理此崩

  • 我试图从我的框架中获得轮廓,这就是我所做的: .................................................... 程序在处崩溃,我收到以下错误消息: OpenCV错误:不支持的格式或格式组合([开始]FindContour只支持8uC1和32sC1图像)在未知的功能,文件......\src\openc v\模块\imgproc\src\contours.cp

  • 我在用lwjgl 3,学习现代opengl (3)。我想发送一个统一的矩阵到顶点着色器,这样我就可以应用变换。我试过了,程序崩溃了,并出现了这个错误 显然我做错了什么。 问题似乎出在这行代码上 如果我删除这一行代码,程序会正确执行。< br > 我试着传递一个对角矩阵来检查问题是否出在矩阵本身,但还是得到了同样的结果 mvp是我传递给着色器的对角矩阵。< br> uniformMatrixLoca