2010-10-08 18 views
13

Qual è l'equivalente di programmazione del clic sul pulsante Chiudi (x) nell'angolo in alto a destra di JFrame?Chiusura programmatica di JFrame

C'è il metodo dispose() ma non è la stessa cosa, dal momento che un JFrame può essere impostato per fare diverse cose differenti su chiusura (per non parlare se c'è un coinvolto WindowListener)

+1

+1. Mi sono sempre chiesto questo, ma non ho mai avuto il tempo di chiedere. – Andy

risposta

16

È dire la componente di inviare un evento . In questo caso, si desidera che invii un evento di chiusura della finestra.

private void exit() { 
    this.dispatchEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING)); 
} 
+0

Cool, questo è quello che stavo cercando. Penso che sia necessario utilizzare Swing.invokeLater(), per assicurarsi che si trovi nel thread di invio dell'evento. –

+0

@Jason, se questo viene chiamato da un componente Swing, allora è già nell'EDT. Questo è il motivo per cui non vuoi mai fare lunghi calcoli all'interno di un componente Swing. (Perché avrebbero bloccato l'EDT) – jjnguy

+0

Giusto. Ma voglio chiamarlo da un altro componente. (Ho usato 'public public closeWindow()' come firma.) –

2

Quando si preme la x su un JFrame, il sistema può essere impostato per eseguire varie operazioni. L'impostazione predefinita è che la finestra è semplicemente nascosta con setVisible (false), credo.

È possibile impostare una cornice per fare cose diverse alla chiusura - si può avere disporre, nascondere o chiamare il codice basato su setDefaultCloseOperation. Ecco le opzioni:

DO_NOTHING_ON_CLOSE: non fare nulla; richiedere al programma di gestire l'operazione nel metodo windowClosing di un oggetto WindowListener registrato.

HIDE_ON_CLOSE: nasconde automaticamente il frame dopo aver richiamato gli oggetti WindowListener registrati.

DISPOSE_ON_CLOSE: nasconde e disponga automaticamente il frame dopo aver richiamato gli oggetti WindowListener registrati.

EXIT_ON_CLOSE: chiude l'applicazione utilizzando il metodo di uscita Sistema. Usalo solo nelle applicazioni.

Ma penso che quello che stai cercando sia setVisible (false).

0

È necessario inserire la chiamata nella coda messaggi AWT in modo che tutti i tempi avvengano correttamente, altrimenti non invierà la sequenza eventi corretta, specialmente in un programma multithread.

public void closeWindow() 
{ 
    if(awtWindow_ != null) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       awtWindow_.dispatchEvent(new WindowEvent(awtWindow_, WindowEvent.WINDOW_CLOSING)); 
      } 
     }); 
    } 
} 
Problemi correlati