Подтвердить что ты не робот

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

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

Я знаю, что stage.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();
}

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

Вся помощь будет принята с благодарностью. Спасибо!

4b9b3361

Ответ 1

  • дайте вашей закрытой кнопке fx: id, если вы еще этого не сделали: <Button fx:id="closeButton" onAction="#closeButtonAction">
  • В классе контроллера:

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

Ответ 2

Если у вас есть окно, которое расширяет 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());
 }

Ответ 3

Я реализовал это следующим образом после получения 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();
}

Ответ 4

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

private void on_btnClose_clicked(ActionEvent actionEvent) {

        Window window = getScene().getWindow();   

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

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

Ответ 5

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

@FXML
private Button cancelButton;

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

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

Ответ 6

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

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

Ответ 7

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

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

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