0

我正在将 JavaFX 登录屏幕嵌入到 Swing 应用程序中。

我将 JFXPanel 添加到 JPanel 的内容框架中。加载应用程序后,一切顺利,直到我将鼠标移到内容窗格内(有关此情况的视频,请参见下面的链接)。当我的鼠标在窗格中主动移动时,渲染变得非常滞后:

  • 鼠标进入窗格时变得迟钝 在此处输入图像描述

期望的行为:

  • 通过 JFXPanel 在 Swing 中使用 JavaFX 设计的 UI,而不会显着降低性能

下面的代码是这个问题的一个最小的、可重现的例子。


import javafx.embed.swing.JFXPanel;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.layout.*;

import javax.swing.*;
import java.io.IOException;
import java.net.URL;

public class TestJFXPanel {

    public static void main(String[] args) throws IOException {

        /*
         Create pane with as background an animated image (GIF)
         */
        final Pane pane = new Pane();
        final URL url = new URL("https://i.stack.imgur.com/AvkzQ.gif");
        pane.setBackground(new Background(new BackgroundImage(
                new Image(url.openStream()),
                BackgroundRepeat.NO_REPEAT,
                BackgroundRepeat.NO_REPEAT,
                BackgroundPosition.CENTER,
                BackgroundSize.DEFAULT)));

        /*
         Set the pane as root of a Scene
         */
        final JFXPanel panel = new JFXPanel();
        panel.setScene(new Scene(pane, 500, 500));

        /*
         Invoke JFrame on AWT thread
         */
        SwingUtilities.invokeLater(() -> {

            final JFrame jFrame = new JFrame();

            // Add JFXPanel to content pane of JFrame
            jFrame.getContentPane().add(panel);
            jFrame.pack();

            jFrame.setVisible(true);
        });
    }
}

我的想法:

  • 我怀疑这与鼠标运动从 JavaFX 重定向到 Swing 导致 FX 和 Swing 线程之间的通信延迟有关。我认为这特别昂贵,因为我使用 GIF 作为登录屏幕的背景图像。
  • 我不确定这是否是由于 FX 和 Swing 的通信延迟造成的,如果是这种情况,在 Swing 中处理我的所有 FX UI 是否会解决这个问题(假设这比将整个设计移植到 Swing 更可行)?

但是,如果有人更熟悉将 JavaFX 与 Swing 集成并认为我的怀疑是错误的。非常感谢有关如何进行的一些建议!

更新:

  • 当我覆盖processMouseMotionEventJFXPanel 类的方法时,不会消耗任何 MouseMotionEvents,问题就不会发生。我认为这可能是 JavaFX 和 MacOS 之间的兼容性问题。
4

0 回答 0