2016-04-14 1 views
0

У меня есть Controller.java для Scene.fxml и ControllerSettings.java для WindowSettings.fxml. В Controller.java создать новое всплывающее окно (без диалога) с следующим способом:Как закрыть новое всплывающее окно из контроллера в JavaFX

@FXML 
    public void handleSubmenuSettings(ActionEvent event) throws IOException { 

     Stage stage; 
     Parent root; 
     ControllerSettings controller; 

     stage = new Stage(); 
     FXMLLoader loader = new FXMLLoader(getClass().getResource("WindowSettings.fxml")); 
     root = (Parent) loader.load(); 
     controller = (ControllerSettings) loader.getController(); 
     stage.setScene(new Scene(root)); 

     stage.setTitle("Settings"); 
     stage.initModality(Modality.APPLICATION_MODAL); 
     stage.setResizable(false); 
     stage.initOwner(submenuSettings.getScene().getWindow()); 
     stage.showAndWait(); 

     stage.setOnCloseRequest(e -> { 
      e.consume(); 
      controller.saveSettings(); 
      stage.close(); 
     }); 
    } 

Я хочу, чтобы сохранить настройки при закрытии нового всплывающего окна, но это не работает с stage.setOnCloseRequest.

ответ

0

Метод showAndWait() блокирует выполнение до тех пор, пока окно не будет закрыто; то есть последующие операторы не будут выполняться до тех пор, пока окно не будет закрыто. Поэтому вы не регистрируете слушателя для запроса на закрытие до тех пор, пока окно не будет закрыто. Очевидно, что никакой запрос на закрытие окна не произойдет после окно закрыто, поэтому ваш обработчик никогда не вызывается.

Непонятно, почему вы используете обработчик запроса закрытия в любом случае. Предположительно, вы просто хотите позвонить controller.saveSettings() после закрытия окна. Поскольку вы используете showAndWait(), вы можете просто:

@FXML 
public void handleSubmenuSettings(ActionEvent event) throws IOException { 

    Stage stage; 
    Parent root; 
    ControllerSettings controller; 

    stage = new Stage(); 
    FXMLLoader loader = new FXMLLoader(getClass().getResource("WindowSettings.fxml")); 
    root = (Parent) loader.load(); 
    controller = (ControllerSettings) loader.getController(); 
    stage.setScene(new Scene(root)); 

    stage.setTitle("Settings"); 
    stage.initModality(Modality.APPLICATION_MODAL); 
    stage.setResizable(false); 
    stage.initOwner(submenuSettings.getScene().getWindow()); 
    stage.showAndWait(); 

    controller.saveSettings(); 
}