Da dove chiudere un'applicazione Java (soprattutto su Mac)

Matteo - 26 apr 2005 00:51

Sembra un problema banale, ma si puo' incappare facilmente in qualche errore nella scelta di dove chiamare le procedure di chiusura di una applicazione, che in genere si occupano di salvare alcune preferenze, gestire il salvataggio dei documenti e cose del genere, prima del fatidico "System.exit(err)".

Intanto la cosa piu' importante e' mettere come al solito tutto quello che serve in un metodo specifico, con un nome "intelligente" ed una posizione in una classe comoda, anziche' mettere tutto il codice in ogni handler di evento direttamente.

La seconda raccomandazione riguarda appunto dove e' opportuno chiamare questo metodo di uscita. Nella maggior parte dei sistemi operativi (Windows, Linux) e' sufficiente chiamarlo dall'handler windowClosing del frame principale dell'applcazione e da quello della voce del menu "Exit".

Cosi' non e' su Mac, che ignora bellamente il primo e non ha il secondo (in quanto il menu File non dovrebbe di norma contenere una voce "Exit" su Mac, e comunque non sarebbe sufficiente in quanto viene aggiunta una voce "Quit" comunque sul cosiddetto menu "Applicazione", ovvero quello tra il menu mela ed il primo menu application-defined). La soluzione migliore su Mac e' quella di aggiungere un ApplicationListener che chiama il metodo di uscita sull'handler "handleQuit". Purtroppo l'ApplicationListener e' una classe di Apple, contenuta nel package com.apple.eawt e non ho idea se essa sia ridistribuibile. Comunque non e' necessaria per la distribuzione dell'applicazione, ma solo per la compilazione, a patto che mettiate il listener in una classe a se' caricata solo nel caso si sia su Mac. Ad esempio, nel costruttore dell'oggetto principale dell'applicazione:

        if(System.getProperty("mrj.version") != null) try {
            new MacAdapter(this); // versione mac
        } catch(Exception e) {
          // ...
        }

dove MacAdapter e' una classe derivata da com.apple.eawt.Application che implementa anche com.apple.eawt.ApplicationListener. Questa classe puo' essere utilizzata per gestire ad esempio il dialogo di About, il quit, il drop dei file nell'icona del dock e altro...

 
Weblog Koan Progetti Foto Contatti DW.net map