Создайте модальную сцену из JFXPanel в приложении Swing

У меня есть приложение Swing, в которое я добавляю компоненты JavaFX. Я хотел бы для одного из моих встроенных JFXPanels, чтобы иметь возможность отображать всплывающее диалоговое окно, используя Stageи для этого Stage быть модальным с существующим JFrame как его владелец.

Самодостаточный, компилируемый пример того, что я сделал, следует ниже. Обратите внимание, что я установил Stage модальность для Modality.APPLICATION_MODALи установили его владельца на Window из Scene в пределах JFXPanel,

Как мне сделать Stage модальный в приложении Swing?

import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import java.awt.BorderLayout;
import java.awt.Dimension;

public class App {

    public static void main(String[] args) {
        new App().run();
    }

    public void run() {

        JFrame applicationFrame = new JFrame("JavaFX Mucking");
        applicationFrame.setSize(new Dimension(300, 300));


        JPanel content = new JPanel(new BorderLayout());
        applicationFrame.setContentPane(content);

        JFXPanel jfxPanel = new JFXPanel();
        content.add(jfxPanel);

        Platform.runLater(() -> jfxPanel.setScene(this.generateScene()));

        applicationFrame.setVisible(true);
        applicationFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    private Scene generateScene() {
        Button button = new Button("Show Dialog");
        Scene scene = new Scene(new BorderPane(button));

        button.setOnAction(actionEvent -> {
            Stage stage = new Stage(StageStyle.UTILITY);
            stage.initOwner(scene.getWindow());
            stage.initModality(Modality.APPLICATION_MODAL);
            stage.setScene(new Scene(new Label("Hello World!")));
            stage.sizeToScene();
            stage.show();
        });

        return scene;
    }
}

1 ответ

Вы сгенерировали объект сцены, поместили его внутри JFXPanel, который был помещен внутри JFrame. В то же время вы поместили ту же сцену, что и основной объект сцены в вашей сцене.

Вы не можете разместить одну и ту же сцену в двух разных местах одновременно. Для создания модального диалога просто используйте объект Stage, потому что Stage и JFrame являются контейнерами верхнего уровня из двух разных библиотек графического интерфейса.

Не добавляйте сцену в JFXPanel и сцену, делайте одно или другое.

Другие вопросы по тегам