Javafx 2 JavaFX";已设置为另一个场景的根“;第二次启动模态对话框时出现异常

Javafx 2 JavaFX";已设置为另一个场景的根“;第二次启动模态对话框时出现异常,javafx-2,Javafx 2,我正在构建一个简单的JavaFX应用程序,需要在主应用程序窗口前面启动一个模式窗口。使用下面的代码,我能够启动模式窗口1次并关闭它。如果我再次尝试启动它,我会收到: java.lang.IllegalArgumentException: BorderPane[id=root, styleClass=root]is already set as root of another scene 我正在使用此处描述的Spring Controller/FXML视图依赖项注入方法: 我能够通过编程创建

我正在构建一个简单的JavaFX应用程序,需要在主应用程序窗口前面启动一个模式窗口。使用下面的代码,我能够启动模式窗口1次并关闭它。如果我再次尝试启动它,我会收到:

 java.lang.IllegalArgumentException: BorderPane[id=root, styleClass=root]is already set as root of another scene
我正在使用此处描述的Spring Controller/FXML视图依赖项注入方法:

我能够通过编程创建场景并隐藏/显示简单对话框,而无需使用FXML/Spring控制器注入。这个很好用

我无法解释“已设置为根”异常,因为每次单击“开始”按钮时,我都会创建一个新场景()。当模式窗口第一次关闭时,第一个场景应该被销毁

相关文件如下

MainTabPanel.java—我的应用程序的主视图。其中包含单击以启动模式窗口的“开始按钮”

ActivePresentation控制器/视图被注入为:
@injectprivate-ActivePresentation-ActivePresentation

下面是initialize()方法,该方法在单击startButton时尝试启动模式

@FXML
 public void initialize()
 {
      availableReceiversIdColumn.setCellValueFactory(new PropertyValueFactory("id"));
      availableReceiversFirmwareVersionColumn.setCellValueFactory(new PropertyValueFactory("firmwareVersion"));
      availableReceiversModelColumn.setCellValueFactory(new PropertyValueFactory("model"));
      availableReceiversChannelColumn.setCellValueFactory(new PropertyValueFactory("channel"));
      ObservableList<String> responseTypes = FXCollections.observableArrayList();
      responseTypes.add("Single Response Alpha");
      responseTypes.add("Single Response Numeric");
      responseTypeChoiceBox.setItems(responseTypes);

      startButton.setOnAction(new EventHandler<ActionEvent>()
      {
           @Override
           public void handle(ActionEvent e)
           {
                Stage stage = new Stage();
                stage.initModality(Modality.APPLICATION_MODAL);

                presentationResponseService.startPresentation();
                activePresentation.populateResponses(null);
                activePresentation.populateResults(null);

                Scene activePresentationScene = new Scene(activePresentation.getView());
                activePresentationScene.getStylesheets().add("styles.css");

                stage.setScene(activePresentationScene);
                stage.setTitle("Active Presentation");
                stage.showAndWait();
           }
      });
 }
FXML加载器

private <T> T loadPresenter(String fxmlFile)
 {
      try
      {
           FXMLLoader loader = new FXMLLoader();
           loader.load(getClass().getResourceAsStream(fxmlFile));
           return (T) loader.getController();
      } catch (IOException e)
      {
           throw new RuntimeException(String.format("Unable to load FXML file '%s'", fxmlFile), e);
      }
 }
private T loadPresenter(字符串fxmlFile)
{
尝试
{
FXMLLoader=新的FXMLLoader();
load(getClass().getResourceAsStream(fxmlFile));
return(T)loader.getController();
}捕获(IOE异常)
{
抛出新的RuntimeException(String.format(“无法加载FXML文件“%s”,fxmlFile)),e;
}
}

似乎舞台仍在JFX的控制之下(逻辑:您可以再次尝试打开它)

每次在previous仍处于活动状态时创建一个stage,因此,能否尝试在stage.close()附近添加stage.setScene(null)

还是每次都使用相同的场景或相同的舞台


我在JFX的这一部分中没有看到任何错误:节点是相同的,阶段(和其中的场景)是不同的。所以有两种方法:只使用一个stage+场景,或者每次创建不同的边框窗格实例。

我在自动连接弹出窗口时遇到了这个问题。它第一次工作时,但当我第二次关闭弹出窗口时,我收到了此错误。
我通过检查弹出窗口是否已经有场景来管理,请参见以下代码:

if (window.getScene() == null) {
    Scene scene = new Scene(window);
    stage.setScene(scene);
} else {
    stage.setScene(window.getScene());
}

似乎,stage仍在JFX的控制下(逻辑:您可以尝试再次打开它),但每次您都会在previous仍处于活动状态时创建一个stage,因此,您是否可以尝试在stage.close()附近添加stage.setScene(null)。还是每次都使用相同的场景或相同的舞台?
private <T> T loadPresenter(String fxmlFile)
 {
      try
      {
           FXMLLoader loader = new FXMLLoader();
           loader.load(getClass().getResourceAsStream(fxmlFile));
           return (T) loader.getController();
      } catch (IOException e)
      {
           throw new RuntimeException(String.format("Unable to load FXML file '%s'", fxmlFile), e);
      }
 }
if (window.getScene() == null) {
    Scene scene = new Scene(window);
    stage.setScene(scene);
} else {
    stage.setScene(window.getScene());
}