我已经在这个项目上工作了一段时间,不知道为什么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)
从错误消息中可以看出,这是一个java平台模块访问问题:
because module javafx.graphics does not export com.sun.glass.utils to unnamed module.
学习:
确保您已遵循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