закрыть окно fxml по коду, javafx

Мне нужно закрыть текущее окно fxml кодом в контроллере

Я знаю сцену.закрыть () или этап.hide () сделайте это в fx

как реализовать это в fxml? Я пытался!--2-->

private void on_btnClose_clicked(ActionEvent actionEvent) {
        Parent root = FXMLLoader.load(getClass().getResource("currentWindow.fxml"));    
        Scene scene = new Scene(root);

        Stage stage = new Stage();            
        stage.setScene(scene);
        stage.show();
}

но это не работает!

вся помощь будет очень признательна. Спасибо!

7 ответов


  1. дайте кнопку закрытия fx: id, если вы еще не: <Button fx:id="closeButton" onAction="#closeButtonAction">
  2. в вашем классе контроллера:

    @FXML private javafx.scene.control.Button closeButton;
    
    @FXML
    private void closeButtonAction(){
        // get a handle to the stage
        Stage stage = (Stage) closeButton.getScene().getWindow();
        // do what you have to do
        stage.close();
    }
    

если у вас есть окно, которое выходит javafx.application.Application; вы можете использовать следующий метод.

Platform.exit();

пример:

public class MainGUI extends Application {
.........

Button exitButton = new Button("Exit");
exitButton.setOnAction(new ExitButtonListener());
.........

public class ExitButtonListener implements EventHandler<ActionEvent> {

  @Override
  public void handle(ActionEvent arg0) {
    Platform.exit();
  }
}

редактировать для красоты Java 8:

 public class MainGUI extends Application {
    .........

    Button exitButton = new Button("Exit");
    exitButton.setOnAction(actionEvent -> Platform.exit());
 }

я реализовал это следующим образом после получения NullPointerException из принятого ответа.

в моем FXML:

<Button onMouseClicked="#onMouseClickedCancelBtn" text="Cancel">

в своем Controller класс:

@FXML public void onMouseClickedCancelBtn(InputEvent e) {
    final Node source = (Node) e.getSource();
    final Stage stage = (Stage) source.getScene().getWindow();
    stage.close();
}

Я не уверен, что это лучший способ (или если он работает), но вы можете попробовать:

private void on_btnClose_clicked(ActionEvent actionEvent) {

        Window window = getScene().getWindow();   

        if (window instanceof Stage){
            ((Stage) window).close();
        }
}

(предполагая, что ваш контроллер является узлом. В противном случае вы должны сначала получить узел (getScene () - это метод Node)


Я нашел хорошее решение, которое не требует запуска события:

@FXML
private Button cancelButton;

close(new Event(cancelButton, stage, null));

@FXML
private void close(Event event) {
    ((Node)(event.getSource())).getScene().getWindow().hide();                      
}

вы можете просто достичь этого с,

@FXML
private void closeAction(ActionEvent evt){
    System.exit(0);
}

будет делать трюк для вас.


stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
    public void handle(WindowEvent we) {                        
        Platform.setImplicitExit(false);
        stage.close();
    }
});

Это эквивалентно hide. Поэтому, когда вы собираетесь открыть его в следующий раз, вы просто проверить, если stage объект выходит или нет. Если он вышел, вы просто show() то есть (stage.show()) звонок. Иначе придется начинать сцену.