Delucidazione su windowClosing

di il
3 risposte

Delucidazione su windowClosing

Ciao!

ho aggiunto l'evento windowClosing per fare in modo che alla chiusura della finestra venga lanciata una operazione:

        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                setConfig();
            }
        });
poi ho settato un jmenuitem per chiudere l'applicazione, e gli ho anche associato la combinazione Ctrl + Q:

itemExit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, InputEvent.CTRL_MASK));
questo lancia il dispose();

ora:
- se chiudo la finestra con la X in alto a destra, o con la combinazione "standard" Alt + F4, funziona
- se invece uso Ctrl + Q, non funziona --> il metodo setConfig() non viene lanciato

una delucidazione please?

3 Risposte

  • Re: Delucidazione su windowClosing

    fermat ha scritto:


    una delucidazione please?
    Se facessi qualche prova con le varie opzioni di setDefaultCloseOperation e tracciando i windowClosing/windowClosed di WindowListener, scopriresti che:

    Se si chiude la finestra con le azioni standard delle finestre (pulsantino 'X', voce "Chiudi" nel menù contestuale o altro a seconda del S.O.), allora a seconda del defaultCloseOperation:
    - se è EXIT_ON_CLOSE, viene invocato solo windowClosing
    - se è DISPOSE_ON_CLOSE, viene invocato prima windowClosing poi windowClosed
    - se è HIDE_ON_CLOSE, viene invocato solo windowClosing (e se era l'unica finestra, la JVM però non termina)
    - se è DO_NOTHING_ON_CLOSE, viene invocato solo windowClosing e la finestra NON si chiude automaticamente. DO_NOTHING_ON_CLOSE serve per fare qualcosa di particolare prima (es. una richiesta di conferma) e poi devi chiuderla tu programmaticamente.


    Se invece invochi esplicitamente il dispose(), allora solo il windowClosed viene invocato. Il windowClosing no. E se era l'unica finestra, allora la JVM può terminare.
  • Re: Delucidazione su windowClosing

    Ciao andbin.

    chiaro come sempre!
    nel jframe ho messo il DISPOSE_ON_CLOSE.
    cmq ho modificato l'evento in windowClosed e funziona tutto alla perfezione:
    
            addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosed(WindowEvent e) {
                    setConfig();
                }
            });
    
    grazie!
  • Re: Delucidazione su windowClosing

    fermat ha scritto:


    cmq ho modificato l'evento in windowClosed e funziona tutto alla perfezione:
    Sì, perché in questo modo il windowClosed viene invocato sia se si chiude la finestra con le sue azioni, sia se fai tu un dispose() a seguito di altro evento (es. menù e/o acceleratore).
Devi accedere o registrarti per scrivere nel forum
3 risposte