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

JavaFX12中模块未导出异常

濮阳烨然
2023-03-14

我将Intellij与JavaFX12一起使用,作为一个单独的库。我设法让它成功了。我做了一个游戏,图形工作很好。现在我想创建一个菜单,带有一些按钮。当我尝试将按钮添加到场景的根时,它会抛出一个异常,有以下异常:

Exception in thread "JavaFX Application Thread" java.lang.IllegalAccessError: superclass access check failed: class com.sun.javafx.scene.control.ControlHelper (in unnamed module @0x77b376ef) cannot access class com.sun.javafx.scene.layout.RegionHelper (in module javafx.graphics) because module javafx.graphics does not export com.sun.javafx.scene.layout to unnamed module @0x77b376ef

我谷歌了一下,发现了一些关于堆栈溢出的解决方案,对我不起作用。我的命令行参数如下(基于这些解决方案):

--module-path "C:\Program Files\Java\javafx-sdk-11.0.2\lib" \
--add-modules=javafx.swing,javafx.graphics,javafx.fxml,javafx.media,javafx.web,javafx.scene,javafx.controls \
-p "C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.base.jar" : \
   "C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.graphics.jar"  \
--add-exports javafx.graphics=ALL-UNNAMED \
--add-exports javafx.controls/com.sun.javafx.charts=ALL-UNNAMED \
--add-exports javafx.graphics/com.sun.javafx.iio=ALL-UNNAMED \
--add-exports  javafx.graphics/com.sun.javafx.iio.common=ALL-UNNAMED \
--add-exports  javafx.graphics/com.sun.javafx.css=ALL-UNNAMED \
--add-exports  javafx.base/com.sun.javafx.runtime=ALL-UNNAMED \
--add-exports javafx.controls/com.sun.javafx.scene.control=ALL-UNNAMED \
--add-exports javafx.graphics/com.sun.javafx.scene.layout=ALL-UNNAMED

谢谢!

编辑1:最小可复制示例

>

  • 下载最新的intellij
  • 创建新的javafx模板项目
  • 添加javafx库
  • 将以下行添加到运行配置中的命令行参数中

    --module-path“C:\ProgramFiles\Java\javafx-sdk-11.0.2\lib”\--add-modules javafx.fxml,javafx.controls

    注意:请检查到库的路径是否正确。

    将start方法更改为:

    @override public void start(Stage primaryStage)引发异常{Button Button=new Button();primaryStage.SetTitle(“Hello World”);primaryStage.SetScene(new Scene(new Group(),300,275));primaryStage.show();}

    重要提示:请确保按钮来自javafx,而不是awt库!如果错误地从awt导入按钮,这将起作用。

    按钮永远不会添加到根(也不会添加到场景),如果你注释创建按钮的行,一切都正常!

    编辑2:

    看起来我正在运行我创建的配置,因为intellij创建的命令行(当我单击...时)是这样的:

    "C:\Program Files\Java\jdk-12.0.2\bin\java.exe" --add-modules javafx.base,javafx.graphics --add-reads javafx.base=ALL-UNNAMED --add-reads javafx.graphics=ALL-UNNAMED "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2019.1\lib\idea_rt.jar=50712:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2019.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Users\dusan\Documents\untitled\out\production\untitled;C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.web.jar;C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.swing.jar;C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.media.jar;C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.graphics.jar;C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.fxml.jar;C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.controls.jar;C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.base.jar;C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx-swt.jar" -p "C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.base.jar;C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.graphics.jar" sample.Main --module-path "C:\Program Files\Java\javafx-sdk-11.0.2\lib" \ --add-modules javafx.fxml,javafx.controls
    
  • 共有1个答案

    谭骏
    2023-03-14

    答案在您的命令行中:

    --module-path "C:\Program Files\Java\javafx-sdk-11.0.2\lib" \
    ...
    -p "C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.base.jar" : \
       "C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.graphics.jar"  \
    

    注意,选项-p--module-path完全相同(参见JEP 261中的application module path)。

    这意味着您添加了两次,但只有最后一次才占上风。因此只有javafx-basejavafx-graphics添加到模块路径中,因此javafx-controls没有添加。这解释了异常(与com.sun.javafx.scene.control.ControlHelper有关),以及您不必要地添加了所有这些--add-exports

    您可能不会使用Swing、Media或Web,因此此命令行将绰绰有余:

    --module-path "C:\Program Files\Java\javafx-sdk-11.0.2\lib" \
    --add-modules javafx.fxml,javafx.controls
    

    可以在IDE中设置这些VM选项。

    所有这些都在这里进行了适当的文档记录:https://openjfx.io/openjfx-docs/(还可以查看特定IDE的文档)。

     类似资料:
    • 问题内容: 我想知道配置模块导出的最佳方法是什么。在下面的示例中,“ async.function”可以是FS或HTTP请求,为示例起见简化了该请求: 这是示例代码(asynmodule.js): 如何仅在执行异步回调后导出模块? 编辑 有关我的实际用例的简短说明:我正在编写一个模块,用于在fs.exists()回调中配置nconf(https://github.com/flatiron/ncon

    • 我有以下问题:

    • 问题内容: react.js的新功能并尝试遵循本教程。不幸的是,页面中给出的代码无法正常工作。webpack抱怨 想知道如何解决它。谢谢。 === App.jsx ==== === main.js === 更新1 我注释掉了所有内容,并在末尾添加了以下内容 现在没有编译错误,但是网页为空白。我不确定这里出什么问题了。 问题答案: 您只能声明一个默认出口,例如: 要么 然后做 如果要导出更多内容,则

    • 本文向大家介绍详解JS模块导入导出,包括了详解JS模块导入导出的使用技巧和注意事项,需要的朋友参考一下 开发中基本不会将所有的业务逻辑代码放在一个JS文件中,特别是在使用前端框架,进行组件化开发中时,会复用相应的组件。这时,就会用到模块导入/导出的方法了。 当然,上面提到有模块的概念,也是在JS用于服务器端编程的时候才会出现,我们在使用前端框架时,使用npm run dev,不就是启动了一个nod

    • 问题内容: 我正在Cython中构建一个程序包。我使用以下作为结构: 但是,在Python 3中安装时出现错误。它在Python 2中运行,但是在Python 3中未编译,但出现以下错误: 动态模块未定义模块导出功能 我怎么解决这个问题?是不编译的原因的结构吗? 问题答案: 您需要使用Python 3(可能是)调用setup.py 。这是因为Python 3为模块启动时调用的函数定义了不同的名称,

    • 本文向大家介绍详解AngularJS中module模块的导入导出,包括了详解AngularJS中module模块的导入导出的使用技巧和注意事项,需要的朋友参考一下 AngularJS是一款来自Google的前端JS框架,它的核心特性有:MVC、双向数据绑定、指令和语义化标签、模块化工具、依赖注入、HTML模板,以及对常用工具的封装,例如$http、$cookies、$location等。 关于An