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

JavaFX模块javafx.graphics

闻人宏盛
2023-03-14

在修复robot.awt的requires问题后,我现在在运行应用程序时遇到了另一个问题。应用程序构建没有问题。堆栈跟踪:

Exception in Application constructor
Exception in thread "main" java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051)
Caused by: java.lang.RuntimeException: Unable to construct Application instance: class reports.Main
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:890)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
    at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.IllegalAccessException: class com.sun.javafx.application.LauncherImpl (in module javafx.graphics) cannot access class reports.Main (in module Reports) because module Reports does not export reports to module javafx.graphics
    at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:361)
    at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:591)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.java:802)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
    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:174)
    ... 1 more

Process finished with exit code 1

共有2个答案

白驰
2023-03-14
  • 如上所述,answer Application.launch使用反射在java反射的帮助下创建应用程序类的实例
  • 但是由于模块的原因,反射在默认情况下是不可访问的。
  • 在某些情况下,您必须为类启用反射,在这种情况下,您必须启用名为reports的包到模块javafx.graphics的反射,以使javafx工作。
  • 因此,您需要模块化您的应用程序,因为z、JDK、JRE和JavaFX都是模块化的;在包src/main/java中创建一个新文件module-info.java,并在reports模块块中使用以下语句

模块报告{

需要javafx.controls;

需要javafx.media

打开报告javafx.graphics;

}

  • 文件module-info.java将您的应用程序定义为一个名为reports的模块,您的模块需要一些模块(javafx.controls和javafx.media)才能工作

注意:模块名称报告取自主类的包名称。

为什么使用模块?
模块是组织应用程序和库的一种新方法,它还支持强大的封装和实现/反射隐藏。

商昂然
2023-03-14

问题的根本原因包含在此行中:

Caused by: java.lang.IllegalAccessException: class com.sun.javafx.application.LauncherImpl (in module javafx.graphics) cannot access class reports.Main (in module Reports) because module Reports does not export reports to module javafx.graphics

Application.launch使用反射创建应用程序类的实例。只有当类在打开或导出到应用程序的模块(javafx.graphics)的包中接收时,像Application这样的外部类才允许通过反射访问您的类。

您需要在报告模块声明中添加以下行之一:

exports reports;
opens reports to javafx.graphics;

最后一行应该是首选的,因为它是限制性更强的一行。如果报告包中还包含例如main类/方法,则应使用第一行。

 类似资料:
  • 我使用Intellij Idea作为我的IDE。因为我需要使用css文件,所以我安装了Intellij Ultimate。现在javaFx并不能同时处理这两个问题。 引发得异常: 初始化引导层java.lang.Module.FindException时出错:找不到模块javafx.controls VM设置与前面的IDE完全相同。令人惊讶的是,如果我在中只放一个jar,那么控制台中显示的丢失的j

  • 和太多其他人一样,我也有同样的问题,编译器找不到JavaFX模块。首先,我正在使用Eclipse,并在Eclipse中添加了我的JavaFX位置作为(像这样),添加了我的项目依赖项(像这样),并确保设置了(像这样)。 之后,我在中的中添加了以下参数: 这将导致以下消息: 初始化引导层 java.lang.module.FindException 时出错:找不到模块 javafx.base 我确实有

  • 标题中的错误是我模块信息中的错误。JAVA我是Java新手,所以我希望在你给出答案时我能理解你的答案。我发现这里的其他问题也提出了同样的问题,他们可能有答案,我只是不知道如何将其应用到我的情况中。 javafx。base读取包javafx。豆 模块化java项目(IntelliJ IDEA):模块的com。测试“读取包”javax。xml。绑定“来自两个”java。xml。绑定“和”java。xm

  • 我已经按照本指南将JavaFX安装到Linux机器上。首先我安装了Java11 然后,我从命令安装了OpenJFX 然后在Eclipse中创建了一个库。 然后我将它包含到我的java项目中。我尝试运行以下代码: 我已经将运行配置更改为: 但是当我编译代码的时候。我得到以下错误: 问题: 哪里有人知道如何解决这个错误吗?我以前安装过JavaFX,但这一次,它对我不起作用。 编辑1:如果我将运行配置更

  • 我有一个Java8应用程序,它使用JavaFX,主类扩展了JavaFX.application.application。目前,我将它作为一个fat jar交付,它在Oracle Java8上运行良好。 现在我希望它能够在OpenJDK11上运行。为了添加JavaFX,我已经将org.openjfx中的工件添加到类路径中,并将它们包含在fat JAR中。如果我从命令行启动我的jar,我会得到 脏的一

  • 我想在现有的IntelliJ IDEA Java项目(Java版本1.8.0_20)中集成一个JavaFX GUI。 虽然我可以在我的IDE中从头创建一个JavaFX项目(启用了JavaFX插件),但我想不出如何创建模块。 我需要为一个新的Java模块定义一个新的模块SDK吗?还是JavaFX模块的类型必须是IntelliJ平台插件?我两样都试了,都没有成功。请帮帮忙。