此问题在此处已有答案:
Module error when running JavaFx media application(2个答案)
12个月前关闭。
我已经在这个项目上工作了一段时间了,但是我不知道为什么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类,并将Media对象传递给它,然后调用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条答案
按热度按时间zlwx9yxi1#
这是一个Java平台模块访问问题,可以从以下错误消息中看出:
研究:
请确保您已严格按照www.example.com上有关NetBeans中JavaFX的入门说明openjfx.io。
另外,请了解
javafx.media
是一个单独的模块,因此无论您在添加或需要其他JavaFX模块时,都需要显式地包含它。例如,如果您的应用是非模块化的(未定义
module-info.java
),并且运行在Windows上(从您的问题看似乎就是这种情况),则您需要定义适当的虚拟机选项,如链接文档的“5.添加虚拟机选项”部分所述:注意,我将
,javafx.media
附加到--add-modules
参数,这样媒体系统将作为一个模块加载,而不是从类路径加载。从类路径而不是模块路径运行某些JavaFX框架代码(当未添加或不需要所需的模块时会出现这种情况)不是受支持的执行模式,也是导致错误的原因。