我一直在经历一些奇怪的行为。我试图编写一个简单的GUI来帮助我与大学项目进行交互,所以我没有使用fxml。到现在为止,JavaFX都可以正常工作-我可以创建场景,画布等。但是当我尝试创建Button时,会引发错误。即使这是我唯一要做的事情,也就是:
public class SnakePlayback extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
Button button = new Button("text");
}
}
这是我得到的错误:
应用程序启动方法中的异常 java.lang.reflect.InvocationTargetException 在java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法) 在java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在java.base / jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.base / java.lang.reflect.Method.invoke(Method.java:566) 在javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464) 在javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363) 在java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法) 在java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在java.base / jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.base / java.lang.reflect.Method.invoke(Method.java:566) 在java.base / sun.launcher.LauncherHelper $ FXHelper.main(LauncherHelper.java:1051) 由以下原因引起:java.lang.RuntimeException:应用程序启动方法中的异常 在javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900) 在javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195) 在java.base / java.lang.Thread.run(Thread.java:834) 原因:java.lang.IllegalAccessError:超类访问检查失败:com.sun.javafx.scene.control.ControlHelper类(未命名模块@ 0x84d43ff)无法访问com.sun.javafx.scene.layout.RegionHelper类(模块中) javafx.graphics),因为模块javafx.graphics不会将com.sun.javafx.scene.layout导出到未命名的模块@ 0x84d43ff 在java.base / java.lang.ClassLoader.defineClass1(本机方法) 在java.base / java.lang.ClassLoader.defineClass(ClassLoader.java:1016) 在java.base / java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174) 在java.base / jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:802) 在java.base / jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:700) 在java.base / jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:623) 在java.base / jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) 在java.base / jdk.internal.loader.ClassLoaders $ AppClassLoader.loadClass(ClassLoaders.java:178) 在java.base / java.lang.ClassLoader.loadClass(ClassLoader.java:521) 在javafx.scene.control.Control。(Control.java:86) 在GUI.SnakePlayback.start(SnakePlayback.java:30) 在javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846) 在javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455) 在javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428) 在java.base / java.security.AccessController.doPrivileged(本机方法) 在javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427) 在javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96) 在javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(本机方法) 在javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174) ...还有1个 运行应用程序GUI.SnakePlayback的异常
我从中可以读到的是它可能是与反射有关的错误。尝试创建按钮时,这不是我第一次看到这种情况!上一次引发异常所需要的只是声明一个按钮,即:
Button button;
但是,这一次,我真的需要使用按钮。
答案 0 :(得分:1)
之所以会这样,是因为您使用的是controlsfx(包含Button类),它需要一个名为graphics的模块
....(in module javafx.graphics) because module javafx.graphics does not export com.sun.javafx.scene.layout to unnamed module
如果您使用的是Java11,则需要将图形模块添加到VM选项中。
如果您使用的是Java12,则需要删除VM选项才能使其正常工作。