Javafx 2 JavaFX";已设置为另一个场景的根“;第二次启动模态对话框时出现异常
我正在构建一个简单的JavaFX应用程序,需要在主应用程序窗口前面启动一个模式窗口。使用下面的代码,我能够启动模式窗口1次并关闭它。如果我再次尝试启动它,我会收到: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视图依赖项注入方法: 我能够通过编程创建
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());
}