Я пытаюсь внедрить стороннее приложение JavaFX в более крупное приложение Swing. Требование состоит в том, что он ведет себя так, как будто это немодальное дочернее окно. У меня вроде как эта работа помогла How to open modal dialog from JFXPanel in JavaFX?.Открыть дочерний диалог JavaFX от JFXPanel в JFrame
Однако порядок заказа окон не установлен правильно. Можно поместить дочерний этап позади родительского JFrame. Я бы не ожидал этого с дочерним окном.
Использование xprop показывает в Ubuntu 16.04, что X11 Atom WM_TRANSIENT_FOR устанавливается только для ребенка JDialog, а не ребенок Stage
Пример - приложение, которое открывает два дочерних окон. Один JavaFX и один Swing. Качели правильно правильно. JavaFX нет.
public class SwingApp {
public static void main(String[] args) throws Exception {
JFrame parent = new JFrame();
parent.setTitle("Parent JFrame");
parent.setSize(200, 150);
JFXPanel jfxPanel = new JFXPanel();
parent.getContentPane().setLayout(new BoxLayout(parent.getContentPane(), BoxLayout.Y_AXIS));
JButton button = new JButton("Open Swing child");
button.addActionListener(e -> {
JDialog child = new JDialog(parent);
child.setModal(false);
child.getContentPane().add(new JLabel("content"));
child.setVisible(true);
});
parent.getContentPane().add(button);
parent.getContentPane().add(jfxPanel);
parent.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
parent.setVisible(true);
Platform.runLater(() -> jfxPanel.setScene(new Scene(createDummyFxApp(jfxPanel))));
}
private static Parent createDummyFxApp(JFXPanel openingPanel) {
Button button = new Button("Open FX child");
button.setOnAction(e -> {
Stage stage = new Stage();
stage.initModality(Modality.NONE);
Window owner = openingPanel.getScene().getWindow();
stage.initOwner(owner);
stage.setTitle("Non-modal child JavaFX window");
stage.setScene(new Scene(new HBox(new Label("content"))));
stage.show();
});
return new HBox(button);
}
}