Search code examples
javafxstage

Why my Stage.close is not Working


Stage.close() is not working for me.

I've checked on: JavaFX 2.0: Closing a stage (window)

Here is my codes:

import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.control.Label;
import javafx.scene.control.Button;
import javafx.stage.Modality;

public class MsgBox {

    public Stage MessageBox(String Title, String Message){

        VBox Pnl = new VBox();
        Pnl.setPadding(new Insets(10,10,10,10));
        Pnl.setSpacing(10);
        Pnl.setAlignment(Pos.CENTER);

            Label LblMsg = new Label(Message);
            Button CmdOK = new Button("OK");

        Pnl.getChildren().addAll(LblMsg, CmdOK);

        Scene SCN = new Scene(Pnl);

        Stage Window = new Stage();
            Window.initModality(Modality.APPLICATION_MODAL);
            Window.setTitle(Title);
            Window.setScene(SCN);
            Window.showAndWait();


        CmdOK.setOnAction(new EventHandler<ActionEvent>(){
            public void handle(ActionEvent ev){
                Window.close();
            }
        });

        return Window;
    }
}

Here is the code that calls the Message Box Class:

CmdUpdate.setOnAction(new EventHandler<ActionEvent>(){
        public void handle(ActionEvent ev){
            new MsgBox().MessageBox("Hello", "Hello World");

        }
 });

Solution

  • Calling Stage#showAndWait waits until the stage closes before returning, so in fact the next line never gets a chance to run.

    Move the line

    Window.showAndWait();
    

    to be the last in the method (crucially - after you set the handler to allow closing the stage), or else just use Stage#show, and your problem should be solved.