закрыть окно FXML-файл по коду, в JavaFX


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

Я знаю стадию.close () или stage.hide() сделайте это в fx

Как реализовать это в fxml? Я пытался

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 36

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();
  }
}

Править ради красоты Явы 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 () - это метод узла)

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

@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()) звоните. В противном случае, вы должны начать сцену.