我正在尝试将 Maven 支持添加到我现有的 JavaFX 项目中。
我首先遵循 OpenJFX 的入门指南,该指南教您如何使用 Maven 编译和运行 Hello World JavaFX 应用程序。完成后,我将项目的文件粘贴到这个新项目中并进行了所需的更改。我的文件夹结构或多或少是这样的:
src/main/
java/
org.openjfx/
Main.java
components/
controllers/
resources/org.openjfx/fxml/
Run Code Online (Sandbox Code Playgroud)
为了运行该项目,我使用以下 Maven 命令:
compiler:compile
javafx:compile
javafx:run
Run Code Online (Sandbox Code Playgroud)
但是,我收到此错误:
应用程序启动方法中的异常 原因:java.lang.IllegalAccessException:类 javafx.fxml.FXMLLoader$ValueElement (在模块 javafx.fxml 中)无法访问类 org.openjfx.controllers.LoginController (在模块 org.openjfx 中),因为模块 org. openjfx 不会将 org.openjfx.controllers 导出到模块 javafx.fxml
这看起来很奇怪,因为显然我正在导出以下内容module-info.java:
src/main/
java/
org.openjfx/
Main.java
components/
controllers/
resources/org.openjfx/fxml/
Run Code Online (Sandbox Code Playgroud)
我想知道命名我的包是否org.openjfx是一个坏主意并且可能会导致问题,但我只是按照教程进行操作。
以下是我的pom.xml文件(如果有任何相关性):
compiler:compile
javafx:compile
javafx:run
Run Code Online (Sandbox Code Playgroud)
该javafx.fxml模块实例化控制器类,并通过反射访问其中的字段和方法。为了使其工作,您需要open包含模块的任何控制器的特定包javafx.fxml。
这是了解模块系统的良好资源。引用其中:
\n\n\n打开、打开、打开\xe2\x80\xa6to。在 Java 9 之前,反射可用于了解包中的所有类型以及类型的所有成员\xe2\x80\x94,甚至\nits 私有成员\xe2\x80\x94,无论您是否希望允许此功能。因此,没有任何东西被真正封装。
\n模块系统的一个关键动机是强大的封装性。默认情况下,模块中的类型无法被其他模块访问,除非\nit\xe2\x80\x99 是公共类型并且导出其包。您仅公开\n您想要公开的包。对于 Java 9,这也适用于\n反射。
\n...
\n允许特定模块仅在运行时访问包。形式为 opens\xe2\x80\xa6to 的模块指令
\nRun Code Online (Sandbox Code Playgroud)\nopens package to comma-separated-list-of-modules \n表示\n特定包\xe2\x80\x99s 公共类型(及其嵌套的公共和受保护\n类型)只能在运行时被列出的模块中的代码访问。\n指定包中的所有类型(以及所有types\xe2\x80\x99\nmembers) 可通过反射访问指定模块中的代码。
\n
请注意,您打开的是包,而不是模块。由于您的控制器位于子包中org.openjfx.controllers(我确实认为您应该更改基本包名称),因此您需要显式打开该子包(可能还有其他子包)。
因此,添加
\nopens org.openjfx.controllers to javafx.fxml ;\nRun Code Online (Sandbox Code Playgroud)\n到你的module-info.java文件应该可以解决问题
| 归档时间: |
|
| 查看次数: |
2668 次 |
| 最近记录: |