2009-02-21 10 views
7

Ho una piccola cornice dove chiedo all'utente la password &. Questo riquadro verrà aperto facendo clic su un pulsante in una finestra principale.java swing chiude la finestra senza uscire dall'app

Quindi ho due pulsanti: ok e annulla.

Quando faccio clic sul pulsante "Annulla", ho bisogno di chiudere questo frame senza uscire dall'app.

Come posso farlo?

risposta

18

È possibile utilizzare Frame.hide() o Frame.dispose(). Vorrei anche raccomandare di esaminare JDialog o JOptionPane

Correzione: hide() è obsoleto. Utilizzare SetVisible (false) invece

+0

ok, e cosa succede se il mio gestore di clic è in una classe diversa extarnal al frame? – Giancarlo

+0

devi passare un riferimento al frame al gestore dei clic (nel costruttore) – TofuBeer

2

Assicurarsi non lo fai:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
+0

questo non è il mio problema amico :) – Giancarlo

1

Fai una funzione nella classe esterna dove si sta implementando la JFrame (è necessario chiudere premendo pulsante Annulla).
Scrivere this.setVisible(false); nell'implementazione di tale funzione.
Infine, chiamare questa funzione nell'implementazione ActionListener quando si desidera chiuderla.

3

Forse un modo più pulito è solo cambiare la setDefaultCloseOperation da EXIT_ON_CLOSE a DISPOSE_ON_CLOSE:

setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
3

Usa this.dispose(); nel metodo listener azione quando il nome utente/password riesce. ad esempio:

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

} 

Se si utilizza le classi interne per gestire gli eventi basta sostituire 'this.Dispose()' con Super_Class_Name.this.dispose();

1

lo si può fare in molti modi, ma questi due modi sono più utilizzabili uno
1. scrittura this.setVisible(false) in all'interno implementato ActionListener
O
2. scrittura this.dispose() all'interno implementato ActionListener. Spero che questo ti possa aiutare.

+0

Questo è esattamente ciò che dice la risposta accettata. Non c'è motivo di aggiungere una risposta solo per ripetere ciò che è già accettato. –

2

setVisible metodo non rilascia risorse di memoria e deve essere utilizzato solo quando il modulo deve essere utilizzato nuovamente.

Il dispose il metodo Rilascia tutte le risorse della schermata nativa utilizzate da questa finestra, i relativi sottocomponenti e tutti i relativi figli di proprietà.Cioè, le risorse per questi componenti verranno distrutte, qualsiasi memoria che consumeranno verrà restituita al sistema operativo e saranno contrassegnate come non visualizzabili.