首页 > 解决方案 > 使用 JavaFX 12 在 Swing 中创建 JFXPanel 时如何修复异常

问题描述

我有一个带有基于 Swing 的 UI 的大型 Java 应用程序,它使用 JavaFX 通过 JFXPanel 组件在某些窗口的部分中呈现视频面板和 WebView 面板。

JDK 8 一切正常,但我正在迁移到 OpenJDK 12 和 JavaFX 12,并且在创建 JFXPanel 时遇到运行时异常。当我调用“new JFXPanel()”时,出现异常:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalAccessError: class 
javafx.embed.swing.JFXPanel (in unnamed module @0x44bebd15) 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 
@0x44bebd15

javafx-sdk-12.0.2 中的 javafx.base 和 javafx.swing jar 文件包含在我的 Eclipse 项目和运行时(以及一些其他 JavaFX jar 中)。

我正在使用 VM 参数:--module-path /Library/Java/javafx-sdk-12.0.2/lib --add-modules javafx.controls,javafx.web,javafx.media,javafx.base

这是 JavaFX 12 中的错误还是我做错了什么?

htmlPanel = new JFXPanel() {
    public Dimension getPreferredSize() {                                              
    return new Dimension(CoreDrawer.scaledSize(width), 
    CoreDrawer.scaledSize(height));                             
        }

    public Dimension getMinimumSize() 
      {
    return getPreferredSize();                  
    }
  };

  Platform.runLater(new Runnable() {    //  run on the JavaFX thread                                                             
  public void run() {                                                                
  initFX(htmlPanel);                                                             
    }
  });

  Platform.setImplicitExit(false);
  thePanel.add(htmlPanel);

函数 initFX() 向 JFXPanel 添加了一个场景,但程序没有通过“new JFXPanel()”

标签: javajavafxjfxpanel

解决方案


Slaw 的评论 'Use --add-modules javafx.web,javafx.media,javafx.swing' 对我有用。需要将 javafx.swing 附加到我的运行配置的“VM 选项”。


推荐阅读