How to close a java window with a button click - J

2019-01-15 06:44发布

问题:

I made a JavaFX project and created the GUI for the first-login frame in the java Scene Builder. When the login is successful, the login frame must be closed and the next frame must be visible (main program frame). I can make the new frame appear, but I can't make the login frame closed. I tried stuff like dispose() but nothing works. Below is the code for the main class:

public class KuberComm extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));

        Scene scene = new Scene(root);
        stage.setResizable(false);
        stage.setTitle("Login to KuberComm");
        stage.setScene(scene);

        stage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}

The handler for the login button is located in another class (controller class made by the NetBeans IDE). I can't figure out what the frame's name is in order to use it in the controller class.

Any help will be much appreciated!

回答1:

give your button a name in the controller class:

@FXML
public Button closeButton;

and add this method:

@FXML
public void handleCloseButtonAction(ActionEvent event) {
    Stage stage = (Stage) closeButton.getScene().getWindow();
    stage.close();
}

In your FXML you need a reference to the button name and the method to call onAction:

<Button fx:id="closeButton" cancelButton="true" layoutX="350.0" layoutY="767.0" mnemonicParsing="false" onAction="#handleCloseButtonAction" prefWidth="100.0" text="Close" />

This would close the stage that this button is on.



回答2:

Use

stage.hide()

If you do this from a controller, you can get the stage from any Node inside the scene of the stage (if necessary let the FXML loader assign one to a field of the controller using the id attribute from the fxml namespace in the fxml):

Window stage = node.getScene().getWindow();


回答3:

Thanks for your time to reply,but in the end I found out how to fix it. I used

((Node)(event.getSource())).getScene().getWindow().hide();

in the if that it's responsible for the successful login. I mean, after a dialog appears that informs the user about their successful login, that code goes there.

(I imported the right stuff too in order to make that line of code work)



回答4:

Similar to the other answers but more precise.

@FXML
public void handleCloseButtonAction(ActionEvent event) {
    ((Stage)(((Button)event.getSource()).getScene().getWindow())).close();
}


回答5:

Although

    getScene().getWindow();

on a Node will get you the stage from the controller, it's important to note that calling close() or hide() are equivalent, and will simply make the login window invisible. As for using dispose():

This link might help to clear up any confusion.



标签: java javafx