2012-11-26 3 views
31

Ich brauche die aktuelle fxml Fenster durch Code in der Steuerungschließen fxml Fenster von Code, javafx

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

schließen

wie dies in fxml zu implementieren? Ich versuchte

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 funktioniert nicht!

Alle Hilfe wird sehr geschätzt. Vielen Dank!

Antwort

102
  1. geben Ihre schließen-Schaltfläche ein fx: id, wenn Sie noch nicht haben: <Button fx:id="closeButton" onAction="#closeButtonAction">
  2. In Ihrem 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(); 
    } 
    
+3

Dieser Ansatz hat bei mir nicht funktioniert. Ich erhalte eine 'NullPointerException' –

+0

erstaunliche Arbeit! Nur für den Fall, dass die Leute sich erinnern, überprüfen Sie den Namen Ihrer Schaltfläche (dieser Fall closeButton) und den Namen Ihrer onClick (dieser Fall closeButtonAction) –

+0

Es nur das Fenster schließen, aber die Anwendung läuft noch !!! –

1

Ich bin mir nicht sicher, ob dies der beste Weg ist (oder wenn es funktioniert), aber man könnte versuchen:

private void on_btnClose_clicked(ActionEvent actionEvent) { 

     Window window = getScene().getWindow(); 

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

(Unter der Annahme, dem Controller ein Knoten ist Ansonsten haben Sie den Knoten zuerst zu erhalten. (getScene() ist eine Methode der Knoten)

13

Wenn Sie ein Fenster haben, die sich javafx.application.Application; Sie die folgende Methode verwenden können.

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

Bearbeiten für die Schönheit der Java 8:

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

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

'Platform.exit()' schließt alle Stufen und schießt die gesamte Anwendung ab. Dies ist möglicherweise nicht erwünscht. – nonybrighto

+0

Das ursprüngliche Poster fragte, wie man ein Fenster (Bühne) schließt, nicht die Anwendung. –

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

Es entspricht hide. Wenn Sie das nächste Mal öffnen, prüfen Sie einfach, ob das stage Objekt beendet ist oder nicht. Wenn es verlassen wird, rufen Sie einfach show(), also (stage.show()). Andernfalls müssen Sie die Bühne beginnen.

4

Ich implementiert dies in der folgenden Weise nach dem Erhalt einer NullPointerException aus der angenommenen Antwort.

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

ich eine schöne Lösung gefunden, die kein Ereignis muss ausgelöst werden:

@FXML 
private Button cancelButton; 

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

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

Sie kann dies einfach mit

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

wird den Trick für Sie tun.