Question

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?

Was it helpful?

Solution

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

OTHER TIPS

Maybe a cleaner way is just change the setDefaultCloseOperation from EXIT_ON_CLOSE to 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();

Make sure you do not:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

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.

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.

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top