【问题标题】:JavaFX application doesn't close with swing contentJavaFX 应用程序不关闭摆动内容
【发布时间】:2019-03-08 08:17:23
【问题描述】:

我尝试将Swing 组件添加到JavaFX 应用程序。我用JButton 创建SwingNode 对象,但不将此元素添加到主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);
    }
}

【问题讨论】:

  • 为什么不将SwingNode添加到场景中?
  • 因为初始化时,我不希望这个元素出现在场景中

标签: java swing javafx


【解决方案1】:

我不知道为什么会这样,但我可以给你一些肮脏的解决方案来解决它。如果您创建 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);
    }
}

【讨论】:

  • 谢谢,但我希望看到一个没有零大小窗格的解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
  • 1970-01-01
  • 2021-01-04
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多