2013-05-01 27 views
0

我正在構建一個簡單的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); 
     } 
} 
+1

看來,舞臺仍在JFX的控制(邏輯:你可以嘗試喲再次打開它),但是每當前一個活着的時候你就創建一個階段,所以,你可以嘗試在stage.close()附近添加stage.setScene(null)。或者每次使用相同的場景或同一個舞臺? – 2013-05-01 18:26:22

回答

0

看來,舞臺仍在JFX的控制(邏輯:你可以嘗試喲再次打開它)。

並且您每次創建一個階段,而以前仍然存在,所以,您可以嘗試在stage.close()附近添加stage.setScene(null)。

或者每次使用相同的場景或同一個舞臺?

我在JFX的這部分看不到任何錯誤:節點是相同的,階段(和場景)是不同的。所以有兩種方法:只使用1個舞臺+場景,或每次創建不同的邊框窗格實例。

0

我有問題,當我有一個彈出窗口自動裝配。它是第一次工作,但當我第二次關閉彈出窗口時,出現此錯誤。
我通過檢查彈出窗口已經有了一個現場管理,看下面的代碼:

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