【发布时间】:2016-12-31 10:44:29
【问题描述】:
我正在尝试将第三方 JavaFX 应用程序嵌入到更大的 Swing 应用程序中。要求是它的行为就好像它是一个非模态子窗口。 How to open modal dialog from JFXPanel in JavaFX? 帮助我完成了这项工作。
但是窗口排序设置不正确。可以将子 Stage 放在父 JFrame 后面。我不希望有一个子窗口。
在 Ubuntu 16.04 中使用 xprop 显示 X11 Atom WM_TRANSIENT_FOR 仅为子 JDialog 设置,而不是子 Stage
示例 - 打开两个子窗口的应用。一个 JavaFX 和一个 Swing。 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);
}
}
【问题讨论】:
标签: java swing javafx javafx-8