嵌入JavaFX组件的Swing应用报错求助
开发环境
- Windows 11系统
- Eclipse版本:2022-06 (4.24.0) Build id: 20220609-1112
代码
package media; import javax.swing.JFrame; import javax.swing.SwingUtilities; import javafx.application.Platform; import javafx.embed.swing.JFXPanel; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.paint.Color; import javafx.scene.text.Text; public class SFXApp { private static void initAndShowGUI() { //This method is invoked on the EDT thread JFrame frame = new JFrame("Swing and JavaFX"); final JFXPanel fxPanel = new JFXPanel(); frame.add(fxPanel); frame.setSize(300,200); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Platform.runLater(new Runnable() { @Override public void run() { initFX(fxPanel); } }); } private static void initFX(JFXPanel fxPanel) { //This method is invoked on the JavaFX thread Scene scene = createScene(); fxPanel.setScene(scene); } private static Scene createScene() { Group root = new Group(); Scene scene = new Scene(root, Color.ALICEBLUE); Text text = new Text(); text.setText("Welcome JavaFX"); root.getChildren().add(text); return (scene); } public static void main(String args[]) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { initAndShowGUI(); } }); } }
配置信息
- Java构建路径:已添加JavaFX相关库(包含javafx.swing、javafx.graphics等模块)
- 运行VM参数:已设置
--module-path指定JavaFX库路径,--add-modules包含javafx.controls,javafx.swing等模块
错误信息(原文)
Exception in thread "AWT-EventQueue-0" java.lang.IllegalAccessError:
class javafx.embed.swing.JFXPanel (in unnamed module @0x6ee9fee9)
cannot access class com.sun.javafx.logging.PlatformLogger (in module
javafx.base) because module javafx.base does not export
com.sun.javafx.logging to unnamed module @0x6ee9fee9 at
javafx.embed.swing.JFXPanel.(JFXPanel.java:136) at
media.SFXApp.initAndShowGUI(SFXApp.java:19) at
media.SFXApp$2.run(SFXApp.java:57) at
java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
at
java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720) at
java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714) at
java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at
java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at
java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
at
java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at
java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at
java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at
java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at
java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at
java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
错误信息(中文翻译)
线程"AWT-EventQueue-0"中出现异常 java.lang.IllegalAccessError:
类javafx.embed.swing.JFXPanel(位于未命名模块@0x6ee9fee9)无法访问类com.sun.javafx.logging.PlatformLogger(位于模块javafx.base),因为模块javafx.base未将com.sun.javafx.logging导出到未命名模块@0x6ee9fee9
at javafx.embed.swing.JFXPanel.(JFXPanel.java:136)
at media.SFXApp.initAndShowGUI(SFXApp.java:19)
at media.SFXApp$2.run(SFXApp.java:57)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
解决方法
这个错误是Java模块系统的权限问题:JavaFX的内部包com.sun.javafx.logging没有被导出给未命名模块(你的Swing应用属于未命名模块),导致JFXPanel无法访问该类。
步骤1:修改VM参数
在Eclipse的运行配置中,给VM参数添加以下内容:
--add-exports javafx.base/com.sun.javafx.logging=ALL-UNNAMED
完整的VM参数示例(替换成你的JavaFX库路径):
--module-path "D:\javafx-sdk-17\lib" --add-modules javafx.controls,javafx.swing --add-exports javafx.base/com.sun.javafx.logging=ALL-UNNAMED
步骤2:优化代码显示(可选)
当前代码中的Text组件默认在左上角,可能看不到,建议添加坐标设置:
text.setText("Welcome JavaFX"); text.setX(80); // 设置X坐标 text.setY(100); // 设置Y坐标
内容的提问来源于stack exchange,提问作者Nathaniel

