简体   繁体   English

JavaFX应用程序无法随摇摆内容一起关闭

[英]JavaFX application doesn't close with swing content

I try to add Swing component to JavaFX application. 我尝试将Swing组件添加到JavaFX应用程序。 I create SwingNode object with JButton but don't add this element to main Scene . 我使用JButton创建了SwingNode对象,但没有将此元素添加到主Scene After closing main stage, application stay running. 关闭主阶段后,应用程序保持运行状态。 What I need to do to fix this? 我需要做些什么来解决这个问题?

Example here: 这里的例子:

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);
    }
}

I don't know why it happens, but I can give you some dirty solution to fix it. 我不知道为什么会这样,但是我可以给您一些肮脏的解决方案来修复它。 Application stay running after closing if you create SwingNode and don't add it to Scene . 如果创建SwingNode并且不将其添加到Scene则应用程序在关闭后SwingNode保持运行状态。 So you need to add SwingNode to Scene , but with zero size. 因此,您需要将SwingNode添加到Scene ,但大小为零。 This must fix your problem. 这必须解决您的问题。

Example: 例:

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);
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM