简体   繁体   中英

java swing close window without exiting app

I have a little frame where I ask user & password. This frame will be opened clicking over a button in a main window.

Then I have two buttons: ok and cancel.

When I click on "cancel" button, I need to close this frame without exiting the app.

How can I do that?

You can use either Frame.hide() or Frame.dispose(). I would also recommend to look into JDialog or JOptionPane

Correction: hide() is deprecated. SetVisible(false) should be used instead

也许更简洁的方法就是将setDefaultCloseOperation从EXIT_ON_CLOSE更改为DISPOSE_ON_CLOSE:

setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

You can call setVisible(false) on the frame.

You might also want to call setDefaultCloseOperation on the frame passing in HIDE_ON_CLOSE (info here: http://java.sun.com/javase/6/docs/api/javax/swing/JFrame.html#setDefaultCloseOperation%28int%29 ). That will prevent the app from going away if they user hits the "X" on the JFrame to close it.

Use this.dispose(); in the action listener method when the username/password succeeds. eg:

public void actionPerformed(ActionEvent ae) {

    if(ae.getSource()=="button you press to confirm username/password"){
        if(userNameTf.getText().equals(username)&&isPassword(passwordTf.getPassword())){
            new "window to be opened upon success"
            this.dispose(); // calls dispose on this object ie. 
                                            // the login window 
        }
        else{
            userNameTf.setText("");
            passwordTf.setText("");

            JOptionPane.showMessageDialog(this,
                    "Username and/or password is incorrect!",
                    "Attention!",
                    JOptionPane.WARNING_MESSAGE);
        }
    }

}

If you are using inner classes to handle the events just replace 'this.dispose()' with Super_Class_Name.this.dispose();

setVisible method does not release memory resources and should be used only when the form is to be used again.

The dispose method Releases all of the native screen resources used by this Window, its subcomponents, and all of its owned children. That is, the resources for these Components will be destroyed, any memory they consume will be returned to the OS, and they will be marked as undisplayable.

确保你没有:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

You can do it in many ways but these two ways are most usable one
1. write this.setVisible(false) in inside implemented ActionListener
Or
2. write this.dispose() inside implemented ActionListener . Hope this will help you.

Make a function in outer class where you are implementing the JFrame (you need to close on pressing cancel button).
Write this.setVisible(false); in the implementation of that function.
Finally call this function in the ActionListener implementation when you want to close it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM