我正在構建一個簡單的JavaFX應用程序,該應用程序需要我在主應用程序窗口前啓動模態窗口。使用下面的代碼,我能夠啓動模式窗口1次並關閉它。如果我試圖再次啓動它,我得到:當第二次啓動模態對話框時,JavaFX「已經設置爲另一個場景的根」異常
java.lang.IllegalArgumentException: BorderPane[id=root, styleClass=root]is already set as root of another scene
我使用這裏介紹的Spring控制器/ FXML查看依賴注入的方法: http://www.zenjava.com/2012/02/20/porting-first-contact-to-spring/
我能夠以編程方式創建一個場景,隱藏/顯示一個簡單的對話框而不使用FXML/Spring Controller注入。這工作正常。
我無法解釋'已設置爲root'異常,因爲每次單擊startButton時都會創建一個新的Scene()。第一場景應該在第一次關閉模式窗口時被銷燬。
相關文件如下。
MainTabPanel.java - 我的應用程序的主視圖。這包含點擊「startButton」來啓動模態窗口。
的ActivePresentation控制器/查看被注入爲: @Inject private ActivePresentation activePresentation;
下面是試圖被點擊時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();
}
});
}
closeButton在模態對話框中定義如下。
closeButton.setOnAction(new EventHandler<ActionEvent>()
{
@Override
public void handle(ActionEvent e)
{
presentationResponseService.closePresentation();
Stage stage = (Stage) root.getScene().getWindow();
stage.close();
}
});
的ActivePresentation豆和FXML裝載機基於Java Spring配置如下。
@Bean
public ActivePresentation activePresentation()
{
return loadPresenter("/fxml/ActivePresentation.fxml");
}
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);
}
}
看來,舞臺仍在JFX的控制(邏輯:你可以嘗試喲再次打開它),但是每當前一個活着的時候你就創建一個階段,所以,你可以嘗試在stage.close()附近添加stage.setScene(null)。或者每次使用相同的場景或同一個舞臺? – 2013-05-01 18:26:22