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

openjfx中的类SwingNode会引起问题

邹麻雀
2023-03-14

我想将JavaFX应用程序迁移到JDK11&OpenJFX,但我注意到SwingNode会引起问题。我决定创建一个新的项目,看看是怎么回事。有趣的是,当我切换到JDK8时,一切都很好。在较新的版本中,会出现错误。我不知道是因为什么。

package sample;

import javafx.application.Application;
import javafx.embed.swing.SwingNode;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 300, 275));
        primaryStage.show();

        // problem
        final SwingNode swingNode = new SwingNode();
    }


    public static void main(String[] args) {
        launch(args);
    }
}
Exception in Application start method
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 javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
    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: Exception in Application start method
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900)
    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.IllegalAccessError: superclass access check failed: class com.sun.javafx.embed.swing.SwingNodeHelper (in unnamed module @0x412b4fb) cannot access class com.sun.javafx.scene.NodeHelper (in module javafx.graphics) because module javafx.graphics does not export com.sun.javafx.scene to unnamed module @0x412b4fb
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
    at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
    at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:802)
    at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:700)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:623)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at javafx.embed.swing.SwingNode.<clinit>(SwingNode.java:143)
    at sample.Main.start(Main.java:20)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
    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
Exception running application sample.Main

VM选项:--module-path${PATH_TO_FX}--add-modules=javafx.controls,javafx.fxml

共有1个答案

云丰
2023-03-14

该堆栈跟踪的重要部分是由:引起的最后一个,即:

Caused by: java.lang.IllegalAccessError: superclass access check failed: class com.sun.javafx.embed.swing.SwingNodeHelper (in unnamed module @0x412b4fb) cannot access class com.sun.javafx.scene.NodeHelper (in module javafx.graphics) because module javafx.graphics does not export com.sun.javafx.scene to unnamed module @0x412b4fb

这意味着“未命名模块”中有一个名为SwingNodeHelper的类,它扩展了javafx.graphics模块中的一个名为NodeHelper的类。然而,javafx.graphics模块并不将这个超类(更具体地说,是超类所属的包)导出到“未命名模块”中。这导致在尝试加载SwingNodeHelper类时出现IllegalAccessError

“未命名模块”是一个特殊的模块(每个类加载器),它包含类路径上的类。SwingNode和相关的SwingNodeHelper类是javafx.swing模块的一部分。这些知识以及给定的错误告诉我们,当需要从ModulePath中使用javafx.swing模块时,它正在从类路径中使用。正如JoséPereda在一篇评论中所说的,修复方法是在--add-modules命令中包含javafx.swing模块。

之所以这样做,是因为javafx.graphics模块确实将所需的包导出到javafx.swing模块,但所有内容都需要在modulepath上才能正常工作。

当或如果您将代码模块化时,您可以放弃--add-modules命令,只需在module-info.java文件中列出适当的requires指令。

module <your-module-name> {
    requires javafx.swing;
    // other directives...
}

相关问题:

  • 运行JavaFx媒体应用程序时出现模块错误
  • 在向布局添加按钮时获取java.lang.Reflect.InvocationTargetException
  • JavaFX 11:创建标签时的IllegalAccessError

 类似资料:
  • 本文向大家介绍PHP中Session可能会引起并发问题,包括了PHP中Session可能会引起并发问题的使用技巧和注意事项,需要的朋友参考一下 在进行Web应用程序开发的时候,人们经常会用Session存储数据。但可能有人不知道,在PHP中,Session使用不当可能会引起并发问题。印度医疗行业软件解决方案提供商Plus91 Technologies高级工程师Kishan Gor在个人博客上对这个

  • 问题内容: 我正在做一个项目,我们正在其中生成一种可编译为Java的语言。我们正在使用的框架(xtext)在其生成的代码中大量使用了boxing。具体来说,如果您有如下声明: 然后,编译后的代码如下所示: 现在,在我正在研究的项目中,在某些情况下,特定的基本二进制运算将变得极为常见(尤其是增量和比较)。 我的问题是:这会在性能方面成为问题,还是JIT(或类似的智能JVM功能)会简单地了解正在发生的

  • OpenJFX 是一个计划中的开源 JavaFX 实现的项目,目前已经通过投票,项目还没正式开始。

  • 主要内容:本节引言:,1.什么是OOM?为什么会引起OOM?,2.避免Bitmap引起的OOM技巧小结,2)图片压缩,3.及时回收图像,4.其他方法,本节小结:本节引言: 上节,我们已经学习了Bitmap的基本用法,而本节我们要来探讨的Bitmap的OOM问题, 大家在实际开发中可能遇到过,或者没遇到过因为Bitmap引起的OOM问题,本节我们 就来围绕这个话题来进行学习~了解什么是OOM,为什么会引起OOM,改善因Bitmap引起的 OOM问题~ 1.什么是OOM?为什么会引起OOM? 答:O

  • 本文向大家介绍VS2013的Browser Link引起的问题,包括了VS2013的Browser Link引起的问题的使用技巧和注意事项,需要的朋友参考一下 环境:vs2013 问题:在调用一个WebApi的时候出现了错误: 于是我用Fiddler 4直接调用这个WebApi,状态码是200(正常的),JSon里却提示在位置9409处文本非法, 以TextView方式查看,在9409处发现了Br

  • 背景: 我正试图找出实现封装React的本机门户实用程序的门户组件的最佳方法。组件只需创建门户的根元素,安全地将其插入DOM,将组件的任何子元素呈现到其中,然后在组件卸载时安全地将其再次从DOM中移除。 问题: React强烈建议避免React安全生命周期方法(componentDidMount、componentDidUpdate等)之外的副作用(如操作DOM)因为这有可能导致问题(内存泄漏、过