如何在 Swing 应用程序中 运行 Javafx stage/scene?

How to run Javafx stage/scene in Swing Application?

我有一个 swing 应用程序,我需要 运行 并打开 JavaFX Scene/stage。我必须 运行 它没有扩展应用程序。我已经尝试了 Whosebug 上发布的大多数解决方案,其中 none 适合我的情况。

这是我最近的尝试,我遇到了 NullPointerException。我的舞台变得空了。这一行 -> [stage.setScene(new Scene(root, SCENEWIDTH, SCENEHEIGHT));]

此时如何解决这个问题?或者有什么优雅的方法可以解决这个问题?这是代码块:

case ADMIN:
      new JFXPanel();
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/AdminView.fxml"));
                        Parent root = loader.load();
                        stage.setScene(new Scene(root, SCENEWIDTH, SCENEHEIGHT));
                        // Give the controller access to the main app
                        AdminController controller = loader.getController();
                        controller.setMainApp();
                        stage.show();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });

break;

如有任何帮助,我们将不胜感激。

此时很可能阶段为空。 stage的初始化在哪里?

如果阶段为空,stage.setScene(...) 将抛出空指针异常。

不要在 Swing 应用程序中使用 Stage;相反,使用 JFrame 并使用 JFXPanel:

在其中嵌入 JavaFX 内容
case ADMIN:

    // I'm assuming this code is on the AWT Event Dispatch thread

    JFrame window = new JFrame();
    JFXPanel jfxPanel = new JFXPanel();
    Platform.runLater(() -> {

        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/AdminView.fxml"));
            Parent root = loader.load();
            jfxPanel.setScene(new Scene(root, SCENEWIDTH, SCENEHEIGHT));
            // Give the controller access to the main app
            AdminController controller = loader.getController();
            controller.setMainApp();

            SwingUtilities.invokeLater(() -> {
                window.add(jfxPanel);
                window.pack();
                window.setVisible(true);
            });

        } catch (Exception e) {
            e.printStackTrace();
        }

    });

break;

这是我从@d.j.brown 建议的 Oracle's tutorial 中找到的解决方案。经过测试。它的工作。心想,如果有人需要的话。

但我现在 运行 我的应用程序中存在一些其他问题。自从我用过舞台。

在此解决方案中,我使用了 JFrame。如果有人知道如何在 Swing 应用程序中使用 Stage,请告诉我。谢谢。

JFrame frame = new JFrame();
                    frame.setUndecorated(true);
                    final JFXPanel fxPanel = new JFXPanel();
                    frame.add(fxPanel);
                    frame.setSize(FRAMEWIDTH, FRAMEHEIGHT);
                    frame.setVisible(true);
                    frame.setResizable(false);


                    Platform.runLater(new Runnable() {
                        @Override
                        public void run() {

                            FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/AdminViewSwing.fxml"));
                            try {
                                Parent root = loader.load();
                                Scene scene = new Scene(root, FRAMEWIDTH, FRAMEHEIGHT);
                                fxPanel.setScene(scene);
                                AdminController controller = loader.getController();
                                controller.setMainApp();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    });