JFrame中的JFXPanel会在鼠标移动时导致帧掉落

时间:2019-06-09 04:20:16

标签: java performance swing javafx jfxpanel

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

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

  • 当鼠标进入窗格时变得迟钝 enter image description here

期望的行为:

  • 通过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集成并且认为我的怀疑是错误的。非常感谢一些有关如何进行的建议!

更新

  • 当我重写JFXPanel类的processMouseMotionEvent方法时,不会消耗MouseMotionEvents时,不会发生此问题。我认为这可能是JavaFX和MacOS之间的兼容性问题。

0 个答案:

没有答案