Приложение JavaFX не закрывается с содержимым свинга - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь добавить Swing компонент в JavaFX приложение.Я создаю SwingNode объект с JButton, но не добавляю этот элемент в main Scene.После закрытия основного этапа приложение продолжает работать.Что мне нужно сделать, чтобы это исправить?

Пример здесь:

public class SwingFx extends Application {

    @Override
    public void start(Stage stage) {
        final SwingNode swingNode = new SwingNode();
        createAndSetSwingContent(swingNode);

        AnchorPane pane1 = new AnchorPane();
        AnchorPane pane2 = new AnchorPane();
        pane1.getChildren().add(swingNode);

        stage.setScene(new Scene(pane2, 100, 50));
        stage.show();
    }

    private void createAndSetSwingContent(final SwingNode swingNode) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                swingNode.setContent(new JButton("Click me!"));
            }
        });
    }

    public static void main(String[] args) {
        launch(args);
    }
}

1 Ответ

0 голосов
/ 07 октября 2018

Я не знаю, почему это происходит, но я могу дать вам грязное решение, чтобы это исправить.Приложение останется запущенным после закрытия, если вы создадите SwingNode и не добавите его в Scene.Поэтому вам нужно добавить SwingNode к Scene, но с нулевым размером.Это должно решить вашу проблему.

Пример:

public class SwingFx extends Application {

    @Override
    public void start(Stage stage) {
        // create pane with SwingNode
        final SwingNode swingNode = new SwingNode();
        createAndSetSwingContent(swingNode);
        StackPane paneWithSwing = new StackPane(swingNode);

        // create invisible pane to initialize SwingPane in Scene
        Pane invisiblePane = new Pane(paneWithSwing);
        invisiblePane.setPrefWidth(0);
        invisiblePane.setPrefHeight(0);
        invisiblePane.setOpacity(0);

        // create Scene without visible SwingPane
        Button button = new Button("Set SwingNode");
        button.setOnAction(event -> {
            invisiblePane.getChildren().clear();
            stage.getScene().setRoot(paneWithSwing);
        });
        StackPane originalPane = new StackPane(invisiblePane, button);
        stage.setScene(new Scene(originalPane, 320, 180));
        stage.show();
    }

    private void createAndSetSwingContent(final SwingNode swingNode) {
        SwingUtilities.invokeLater(() -> swingNode.setContent(new JButton("Click me!")));
    }

    public static void main(String[] args) {
        launch(args);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...