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

时间:2016-10-18 13:53:12

标签: java swing javafx fxmlloader jfxpanel

我有一个swing应用程序,我需要运行并打开JavaFX Scene / stage。我必须运行它而不扩展Application。我已经尝试过在Stackoverflow上发布的大多数解决方案,它们都没有在我的情况下工作。

这是我最近的尝试,我收到了NullPointerException。我的舞台变成了NULL。这一行 - > [stage.setScene(新场景(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;

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

这是我从@ d.j.brown建议的Oracle's tutorial找到的解决方案。测试。它正在发挥作用。想,如果有人需要的话。

但我现在正在运行我的应用程序中的其他一些问题。因为我使用过Stage。

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

public static readonly IComparer Instance = new MobileModelComparer();