我正在将 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 集成并认为我的怀疑是错误的。非常感谢有关如何进行的一些建议!
更新:
- 当我覆盖
processMouseMotionEvent
JFXPanel 类的方法时,不会消耗任何 MouseMotionEvents,问题就不会发生。我认为这可能是 JavaFX 和 MacOS 之间的兼容性问题。