Java openjfx中的SwingNode类会导致问题

Java openjfx中的SwingNode类会导致问题,java,javafx,openjfx,Java,Javafx,Openjfx,我想将JavaFX应用程序迁移到JDK 11和OpenJFX,我注意到SwingNode会导致问题。我决定创建一个新项目,看看会发生什么。 有趣的是,当我切换到JDK 8时,一切都很好。 在较新版本中,会出现错误。我不知道是什么原因 package sample; import javafx.application.Application; import javafx.embed.swing.SwingNode; import javafx.fxml.FXMLLoader; import ja

我想将JavaFX应用程序迁移到JDK 11和OpenJFX,我注意到SwingNode会导致问题。我决定创建一个新项目,看看会发生什么。 有趣的是,当我切换到JDK 8时,一切都很好。 在较新版本中,会出现错误。我不知道是什么原因

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);
    }
}
应用程序启动方法中出现异常 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.LaunchImpl.launchApplicationWithArgs(LaunchImpl.java:464) 位于javafx.graphics/com.sun.javafx.application.LaunchImpl.launchApplication(LaunchImpl.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.launchelper$FXHelper.main(launchelper.java:1051) 原因:java.lang.RuntimeException:应用程序启动方法中的异常 位于javafx.graphics/com.sun.javafx.application.LaunchImpl.launchApplication1(LaunchImpl.java:900) 在javafx.graphics/com.sun.javafx.application.LaunchImpl.lambda$launchApplication$2(LaunchImpl.java:195) 位于java.base/java.lang.Thread.run(Thread.java:834) 原因:java.lang.IllegalAccessError:超类访问检查失败:类com.sun.javafx.embed.swing.SwingNodeHelper(在未命名模块@0x412b4fb中)无法访问类com.sun.javafx.scene.NodeHelper(在模块javafx.graphics中),因为模块javafx.graphics没有将com.sun.javafx.scene导出到未命名模块@0x412b4fb 位于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.findclassonclasspathrnull(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.embed.swing.SwingNode。(SwingNode.java:143) 在sample.Main.start处(Main.java:20) 在javafx.graphics/com.sun.javafx.application.launchempl.lambda$launchApplication1$9(launchempl.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.invokelateDispatcher$Future.run(invokelateDispatcher.java:96) 在javafx.graphics/com.sun.glass.ui.win.WinApplication.\u runLoop(本机方法) 位于javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174) ... 还有一个 运行应用程序sample.Main时出现异常 虚拟机选项:
--模块路径${path_TO_FX}--add modules=javafx.controls,javafx.fxml

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

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
的类,它扩展了一个名为
NodeHelper
的类,该类存在于
javafx.graphics
模块中。但是,
javafx.graphics
模块不会将该超类(更具体地说,该超类所属的包)导出到“未命名模块”。当尝试加载
SwingNodeHelper
类时,这将导致出现
IllegalAccessError

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

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

当或如果您将代码模块化,您可以放弃
--addmodules
命令,只需在
模块信息.java
文件中列出相应的
requires
指令

module <your-module-name> {
    requires javafx.swing;
    // other directives...
}
模块{
需要javafx.swing;
//其他指令。。。
}

相关问题:


发布您如何使用Java 11运行应用程序(虚拟机选项、模块路径、添加模块…)虚拟机选项:--module path${path\u TO_FX}--add modules=javafx.controls,javafx.fxml以及如何添加
javafx.swing
?它包含
SwingNode
。你需要把它包括进去
module <your-module-name> {
    requires javafx.swing;
    // other directives...
}