0

我有一个摇摆应用程序,我需要在其中运行和打开 JavaFX 场景/舞台。我必须在没有扩展应用程序的情况下运行它。我已经尝试了 Stackoverflow 上发布的大多数解决方案,但没有一个适合我的情况。

这是我最近的尝试,我得到了 NullPointerException。我的舞台正在为NULL。这一行 -> [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;

任何帮助将不胜感激。

4

3 回答 3

4

不要Stage在 Swing 应用程序中使用 a;相反,使用 aJFrame并使用 a 将 JavaFX 内容嵌入其中JFXPanel

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;
于 2016-10-18T16:54:08.800 回答
0

这是我从@djbrown 建议的Oracle 教程中找到的解决方案。经测试。它正在工作。心想,如果有人需要的话。

但是我现在在我的应用程序中遇到了一些其他问题。因为我用过Stage。

在这个解决方案中,我使用了 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();
                            }
                        }
                    });
于 2016-10-18T17:00:57.417 回答
0

那时最有可能的阶段是空的。stage的初始化在哪里?

如果 stage 为 null,stage.setScene(...) 将抛出一个空指针异常。

于 2016-10-18T14:01:06.927 回答