2009-02-21 56 views
7

Tengo un pequeño marco en el que pido al usuario & contraseña. Este marco se abrirá haciendo clic sobre un botón en una ventana principal.java swing cerrar la ventana sin salir de la aplicación

Luego tengo dos botones: ok y cancelar.

Cuando hago clic en el botón "cancelar", necesito cerrar este marco sin salir de la aplicación.

¿Cómo puedo hacer eso?

Respuesta

18

Puede usar Frame.hide() o Frame.dispose(). También recomendaría buscar en JDialog o JOptionPane

Corrección: hide() está en desuso. SetVisible (falso) se debe usar en su lugar

+0

bien, y ¿qué sucede si mi manejador de clics está en una clase extarnal diferente al marco? – Giancarlo

+0

tiene que pasar una referencia al marco para el controlador de clic (en el constructor) – TofuBeer

2

Asegúrese de que usted no:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
+0

este no es mi problema amigo :) – Giancarlo

1

hacer una función en la clase exterior, donde se está implementando el JFrame (que necesita para cerrar al pulsar el botón de cancelación).
Escriba this.setVisible(false); en la implementación de esa función.
Finalmente, llame a esta función en la implementación ActionListener cuando desee cerrarla.

3

Tal vez una forma más limpia se acaba de cambiar el setDefaultCloseOperation de EXIT_ON_CLOSE a DISPOSE_ON_CLOSE:

setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
3

Uso this.dispose(); en el método detector acción cuando el nombre de usuario/contraseña tiene éxito. por ejemplo:

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

} 

Si está usando clases internas para manejar los eventos simplemente reemplazar 'this.Dispose()' con Super_Class_Name.this.dispose();

1

Usted puede hacer de muchas maneras, pero estas dos formas son más fácil de usar uno
1. escritura this.setVisible(false) en el interior implementado ActionListener
O
2. escritura this.dispose() dentro implementado ActionListener. Espero que esto te ayude.

+0

Esto es exactamente lo que dice la respuesta aceptada. No hay razón para agregar una respuesta solo para repetir lo que ya está aceptado. –

2

setEl método visible no libera recursos de memoria y solo se debe usar cuando el formulario se va a usar nuevamente.

dispose método Libera todos los recursos de pantalla nativos utilizados por esta ventana, sus subcomponentes y todos sus hijos propios.Es decir, los recursos para estos componentes se destruirán, cualquier memoria que consuman se devolverá al sistema operativo y se marcarán como no reproducibles.

Cuestiones relacionadas