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