Вы устанавливаете Scene
в главном потоке.Из документации JFXPanel
( упор мой):
Существуют некоторые ограничения, связанные с JFXPanel
.Как компонент Swing, к нему следует обращаться только из потока диспетчеризации событий, за исключением метода setScene(javafx.scene.Scene)
, который можно вызывать либо в потоке диспетчеризации событий, либо в потоке приложения JavaFX.
Завершение setScene
в вызове Platform.runLater
(или SwingUtilities.invokeLater
).
Platform.runLater(() -> {
dummyPanel.setScene(dummyScene);
System.out.println("Scene Created");
});
Обратите внимание, что с вашим текущим кодом, когда main
вернет, JVM продолжит работу,Создание JFXPanel
инициализирует среду выполнения JavaFX, которая не завершится, пока не закроется последнее окно (только когда Platform.isImplicitExit
равно true
) или Platform.exit
вызвано.Поскольку ваш код не выполняет ни одной из этих функций, среда выполнения JavaFX продолжит работать.
В документации JFXPanel
также приведен пример того, как его можно использовать (обратите внимание, что почти все происходит на Поток отправки события или Поток приложения JavaFX ):
Вот типичный пример использования JFXPanel
:
public class Test {
private static void initAndShowGUI() {
// This method is invoked on Swing thread
JFrame frame = new JFrame("FX");
final JFXPanel fxPanel = new JFXPanel();
frame.add(fxPanel);
frame.setVisible(true);
Platform.runLater(new Runnable() {
@Override
public void run() {
initFX(fxPanel);
}
});
}
private static void initFX(JFXPanel fxPanel) {
// This method is invoked on JavaFX thread
Scene scene = createScene();
fxPanel.setScene(scene);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
initAndShowGUI();
}
});
}
}