it-swarm.com.ru

закрыть окно 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();
}

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

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

39
alfredo138923
  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();
    }
    
124
Abdullah Battal

Если у вас есть окно, которое расширяет javafx.application.Application;, вы можете использовать следующий метод . (Это закроет все приложение, а не только окно. Я неверно истолковал OP, спасибо комментаторам за указание на это).

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

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

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

@FXML
private Button cancelButton;

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

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

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

private void on_btnClose_clicked(ActionEvent actionEvent) {

        Window window = getScene().getWindow();   

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

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

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

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

0
Om Prakash