zamknij okno fxml kodem, javafx

Muszę zamknąć bieżące okno fxml kodem w kontrolerze

Znam scenę.close() lub stage.hide () zrób to w fx

Jak zaimplementować to w fxml? Próbowałem

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();
}
Ale to nie działa! Wszelka pomoc będzie bardzo mile widziana. Dzięki!
Author: pupeno, 2012-11-26

7 answers

  1. Podaj swój przycisk zamykania fx:id, jeśli jeszcze tego nie zrobiłeś: <Button fx:id="closeButton" onAction="#closeButtonAction">
  2. W klasie kontrolera:

    @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();
    }
    
 115
Author: Abdullah Battal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-28 09:55:25

Jeśli masz okno, które rozszerza javafx.application.Application; możesz użyć następującej metody.

Platform.exit();

Przykład:

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

Edit for the beauty of Java 8:

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

    Button exitButton = new Button("Exit");
    exitButton.setOnAction(actionEvent -> Platform.exit());
 }
 16
Author: codepleb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-05 20:34:45

Zaimplementowałem to w następujący sposób po otrzymaniu NullPointerException z zaakceptowanej odpowiedzi.

W moim FXML:

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

In my Controller class:

@FXML public void onMouseClickedCancelBtn(InputEvent e) {
    final Node source = (Node) e.getSource();
    final Stage stage = (Stage) source.getScene().getWindow();
    stage.close();
}
 7
Author: Austin D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-11 05:18:13

Nie jestem pewien, czy to jest najlepszy sposób (lub czy to działa), ale możesz spróbować:

private void on_btnClose_clicked(ActionEvent actionEvent) {

        Window window = getScene().getWindow();   

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

(zakładając, że twój kontroler jest węzłem. W przeciwnym razie musisz najpierw pobrać węzeł (getScene() jest metodą węzła)

 1
Author: Puce,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-27 17:56:51

Znalazłem fajne rozwiązanie, które nie wymaga wywołania zdarzenia:

@FXML
private Button cancelButton;

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

@FXML
private void close(Event event) {
    ((Node)(event.getSource())).getScene().getWindow().hide();                      
}
 1
Author: lolo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-25 09:42:05

Można to po prostu osiągnąć za pomocą,

@FXML
private void closeAction(ActionEvent evt){
    System.exit(0);
}
Zrobi to za ciebie.
 0
Author: Oshan_Mendis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-29 13:19:09
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
    public void handle(WindowEvent we) {                        
        Platform.setImplicitExit(false);
        stage.close();
    }
});

Jest odpowiednikiem hide. Więc kiedy zamierzasz go otworzyć następnym razem, po prostu sprawdź, czy obiekt stage jest zamknięty, czy nie. Jeśli jest wyłączony, wystarczy show() tzn. (stage.show()) zadzwonić. W przeciwnym razie musisz zacząć scenę.

 0
Author: Om Prakash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-09 15:32:15