繁体   English   中英

如何在Swing应用程序中运行Javafx阶段/场景?

[英]How to run Javafx stage/scene in Swing Application?

我有一个swing应用程序,需要在其中运行并打开JavaFX Scene / stage。 我必须在不扩展应用程序的情况下运行它。 我已经尝试了Stackoverflow上发布的大多数解决方案,但都无法在我的情况下使用。

这是我的最新尝试,并且我收到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;

任何帮助将不胜感激。

不要在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;

此时,很有可能阶段为null。 阶段的初始化在哪里?

如果stage为null,stage.setScene(...)将抛出nullpointer异常。

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

但是我现在在我的应用程序中遇到其他一些问题。 自从我使用舞台。

在此解决方案中,我使用了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();
                            }
                        }
                    });

暂无
暂无

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

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