Я работаю над внедрением экрана входа JavaFX в приложение Swing.
Я добавил JFXPanel в фрейм контента JPanel. После загрузки приложения все будет хорошо и гладко, пока я не наведу курсор мыши на панель содержимого (см. Ссылку ниже для просмотра видео).
В то время как моя мышь активно движется в области, рендеринг становится очень медленным:
- Становится медленным, когда мышь входит в панель
Желаемое поведение:
- Использование разработанного JavaFX пользовательского интерфейса в Swing с помощью JFXPanel без существенного снижения производительности
Приведенный ниже код является минимальным воспроизводимым примером этой проблемы.
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);
});
}
}
Мои мысли:
- Я подозреваю, что это как-то связано с перенаправлением движения мыши на Swing из JavaFX, что вызывает задержку связи между потоками FX и Swing. Я думаю, что это особенно дорого, потому что я использую GIF в качестве фонового изображения экрана входа в систему.
- Я не уверен, вызвано ли это задержкой связи FX и Swing, если это так, то обработка всего моего пользовательского интерфейса FX в Swing решит эту проблему (при условии, что это более осуществимо, чем перенос всей конструкции на Swing). )?
Однако, если кто-то более знаком с интеграцией JavaFX с Swing и считает, что мои подозрения ошибочны. Некоторые советы о том, как поступить, очень ценятся!
Обновление:
- Когда я переопределяю метод
processMouseMotionEvent
класса JFXPanel, чтобы не происходило потребления MouseMotionEvents, проблема не возникает. Я думаю, что это может быть проблема совместимости между JavaFX и MacOS.