it-swarm.com.de

fxml-Fenster mit dem Code javafx schließen

Ich muss das aktuelle fxml-Fenster per Code im Controller schließen

Ich weiß, dass stage.close () oder stage.hide () dies in fx tun

wie man dies in fxml umsetzt? Ich habe es versucht

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

aber es geht nicht!

Alle Hilfe wird sehr geschätzt. Vielen Dank!

39
alfredo138923
  1. geben Sie Ihrem Schließen-Button eine fx: id, falls Sie noch nicht: <Button fx:id="closeButton" onAction="#closeButtonAction">
  2. In Ihrer Controller-Klasse:

    @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

Wenn Sie ein Fenster haben, das javafx.application.Application; erweitert, können Sie die folgende Methode verwenden . (Dadurch wird die gesamte Anwendung geschlossen, nicht nur das Fenster. Ich habe das OP falsch interpretiert, dank der Kommentatoren, die darauf hingewiesen haben.

Platform.exit();

Beispiel:

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 für die Schönheit von Java 8:

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

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

Ich habe dies auf folgende Weise implementiert, nachdem ich eine NullPointerException von der akzeptierten Antwort erhalten hatte.

In meiner FXML:

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

In meiner Controller-Klasse:

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

Ich habe eine Nice-Lösung gefunden, bei der kein Ereignis ausgelöst werden muss:

@FXML
private Button cancelButton;

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

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

Ich bin nicht sicher, ob dies der beste Weg ist (oder ob es funktioniert), aber Sie könnten versuchen:

private void on_btnClose_clicked(ActionEvent actionEvent) {

        Window window = getScene().getWindow();   

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

(Angenommen, Ihr Controller ist ein Knoten. Andernfalls müssen Sie zuerst den Knoten erhalten (getScene () ist eine Methode des Knotens).

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

Es ist äquivalent zu hide. Wenn Sie es das nächste Mal öffnen, prüfen Sie einfach, ob das stage-Objekt beendet ist oder nicht. Wenn es beendet wird, rufen Sie einfach show(), d. H. (stage.show()), auf. Ansonsten musst du die Etappe starten.

0
Om Prakash