You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌入JavaFX组件的Swing应用报错求助

Swing嵌入JavaFX组件报错求助

开发环境

  • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 15:48:10