与swing一起使用的webEngine JavaFX出现问题



我正在尝试使用JavaFX WebEngineer加载浏览器,以使如下

SwingUtilities.invokeLater(() -> InitGUI());
final JFXPanel jfxPanel = new JFXPanel();
panel.add(jfxPanel);
Platform.runLater(() -> {
WebView webView = new WebView();
jfxPanel.setScene(new Scene(webView));
webView.getEngine().load("https://pl.wikipedia.org/wiki/London");
});

网站显示在我的swing应用程序中,但当我在加载的网站上移动鼠标时,IntelliJ会抛出

Exception in thread "AWT-EventQueue-0" java.lang.NoSuchMethodError: 'void com.sun.javafx.embed.EmbeddedSceneInterface.mouseEvent(int, int, boolean, boolean, boolean, int, int, int, int, boolean, boolean, boolean, boolean, boolean)'
at javafx.embed.swing.JFXPanel.sendMouseEventToFX(JFXPanel.java:426)
at javafx.embed.swing.JFXPanel.processMouseEvent(JFXPanel.java:465)
at java.desktop/java.awt.Component.processEvent(Component.java:6401)
at java.desktop/java.awt.Container.processEvent(Container.java:2263)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5012)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4844)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4919)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEnterExit(Container.java:4691)
at java.desktop/java.awt.LightweightDispatcher.trackMouseEnterExit(Container.java:4677)
at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4528)
at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4489)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2764)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4844)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
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)

我应该在某个地方添加mouseEventListeners吗?整个GUI都在我的Main类中,没有任何按钮,只有JLabels和这个来自javaFX的webView。每次移动鼠标/单击时,只有此webView才会出现错误。其他挥杆部件不会投掷任何东西。

@编辑我还没有发布第一行异常

Exception in thread "AWT-EventQueue-0" java.lang.NoSuchMethodError: 'void com.sun.javafx.embed.EmbeddedSceneInterface.mouseEvent(int, int, boolean, boolean, boolean, int, int, int, int, boolean, boolean, boolean, boolean, boolean)'

问题已解决

我添加了

--module-path /Users/<user>/javafx-sdk-15/lib --add-modules=javafx.controls,javafx.fxml,javafx.web,javafx.swing

在运行>编辑配置>VM选项

添加模块并没有解决问题——我已经添加了它们。

解决方案

没有在JavaFX Gradle插件中指定JavaFX版本为我解决了这个问题。

javafx {
version = "11.0.1" // ← I removed this line
modules = [ 'javafx.controls', ...
}

详细信息

我试图使用CalendarFX;事实证明,我尝试使用的版本11.8.3使用的是JavaFX13.0.1。

一旦我升级或删除了我包含的JavaFX版本,异常就消失了。

完全异常

Exception in thread "AWT-EventQueue-0" java.lang.NoSuchMethodError: 'void com.sun.javafx.embed.EmbeddedSceneInterface.mouseEvent(int, int, boolean, boolean, boolean, int, int, int, int, boolean, boolean, boolean, boolean, boolean)'
at javafx.swing/javafx.embed.swing.JFXPanel.sendMouseEventToFX(JFXPanel.java:426)
at javafx.swing/javafx.embed.swing.JFXPanel.processMouseEvent(JFXPanel.java:465)
at java.desktop/java.awt.Component.processEvent(Component.java:6400)
at java.desktop/java.awt.Container.processEvent(Container.java:2263)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5011)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4843)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEnterExit(Container.java:4698)
at java.desktop/java.awt.LightweightDispatcher.trackMouseEnterExit(Container.java:4676)
at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4527)
at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2772)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4843)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
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)

我正在使用Maven进行构建,我的解决方案也与依赖关系的版本有关,但我没有删除版本,而是将每个javafx库升级到最新的可用版本。在此之前,使用了导致问题的旧版本,因此在pom.xml中,我编辑了<version>标记。

之前:

<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>13</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>13</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-swing</artifactId>
<version>11</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-base</artifactId>
<version>13</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-graphics</artifactId>
<version>13</version>

之后:

<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>17.0.1</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>17.0.1</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-swing</artifactId>
<version>17.0.1</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-base</artifactId>
<version>17.0.1</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-graphics</artifactId>
<version>17.0.1</version>
</dependency>

最新更新