Gestione delle finestre

Adobe AIR 1.0 e versioni successive

Potete utilizzare le proprietà e i metodi della classe NativeWindow per gestire l'aspetto, il comportamento e il ciclo di vita delle finestre desktop.

Nota: quando utilizzate il framework Flex, è in genere meglio gestire il comportamento delle finestre utilizzando le classi del framework. L'accesso alla maggior parte delle proprietà e dei metodi NativeWindow è possibile mediante le classi mx:WindowedApplication e mx:Window.

Ottenere un'istanza NativeWindow

Per modificare una finestra, occorre innanzitutto ottenere l'istanza della finestra. Potete ottenere un'istanza della finestra da una delle posizioni seguenti:

  • Il metodo di costruzione della finestra nativa usato per creare la finestra:

    var win:NativeWindow = new NativeWindow(initOptions);
  • La proprietà nativeWindow dello stage della finestra:

    var win:NativeWindow = stage.nativeWindow;
  • La proprietà stage di un oggetto di visualizzazione nella finestra:

    var win:NativeWindow = displayObject.stage.nativeWindow;
  • La proprietà target dell'evento window nativo inviato dalla finestra:

    private function onNativeWindowEvent(event:NativeWindowBoundsEvent):void 
    { 
        var win:NativeWindow = event.target as NativeWindow; 
    }
  • La proprietà nativeWindow di una pagina HTML visualizzata nella finestra:

    var win:NativeWindow = htmlLoader.window.nativeWindow;
  • Le proprietà activeWindow e openedWindows dell'oggetto NativeApplication:

    var nativeWin:NativeWindow = NativeApplication.nativeApplication.activeWindow; 
    var firstWindow:NativeWindow = NativeApplication.nativeApplication.openedWindows[0];

    NativeApplication.nativeApplication.activeWindow fa riferimento alla finestra attiva di un'applicazione (ma restituisce null se la finestra attiva non è una finestra dell'applicazione AIR). L'array NativeApplication.nativeApplication.openedWindows contiene tutte le finestre di un'applicazione AIR che non è stata chiusa.

Poiché gli oggetti Flex mx:WindowedApplication e mx:Window sono oggetti di visualizzazione, potete fare facilmente riferimento alla finestra dell'applicazione in un file MXML usando la proprietà stage , come segue:

<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" applicationComplete="init();"> 
    <mx:Script> 
        <![CDATA[ 
            import flash.display.NativeWindow; 
 
            public function init():void{ 
                var appWindow:NativeWindow = this.stage.nativeWindow; 
                //set window properties 
                appWindow.visible = true; 
            } 
        ]]> 
    </mx:Script> 
</WindowedApplication
Nota: la proprietà stage del componente WindowedApplication o Window rimane null fino a quando il framework Flex non aggiunge questo componente allo stage della finestra. Questo comportamento è coerente con quello del componente Application di Flex, ma non significa che non sia possibile accedere allo stage o all'istanza NativeWindow in listener per eventi che si verificano in precedenza durante il ciclo di inizializzazione dei componenti WindowedApplication e Window, ad esempio creationComplete . L'accesso allo stage e all'istanza NativeWindow è sicuro quando viene inviato l'evento applicationComplete .

Attivare, mostrare e nascondere finestre

Per attivare una finestra, potete chiamare il metodo activate() della classe NativeWindow. L'operazione di attivazione porta una finestra in primo piano, attiva la tastiera e il mouse, e, se necessario, rende la finestra visibile ripristinandola o impostando la proprietà visible su true . L'attivazione di una finestra non cambia l'ordine delle altre finestre nell'applicazione. La chiamata al metodo activate() causa l'invio di un evento activate .

Per mostrare o nascondere una finestra senza attivarla, potete impostare la proprietà visible su true . Questa operazione porta la finestra in primo piano senza però attivarla.

Per nascondere una finestra, potete impostare la sua proprietà visible su false . Nascondere una finestra significa non visualizzare la finestra, le eventuali icone della barra delle applicazioni correlate e, in Mac OS X, le voci del menu Finestre.

Se cambiate la visibilità di una finestra, viene cambiata anche la visibilità di tutte le finestre di cui la finestra è proprietaria. Ad esempio, se nascondete una finestra, vengono nascoste anche tutte le finestre di proprietà.

Nota: in Mac OS X, non è possibile nascondere completamente una finestra ridotta a icona che presenta un'icona nella parte finestra del dock. Se, in una finestra ridotta a icona, la proprietà visible è impostata su false , l'icona del dock per la finestra è ancora visualizzata. Se l'utente fa clic sull'icona, la finestra viene ripristinata in una stato visibile e visualizzata.

Modifica dell'ordine di visualizzazione delle finestre

AIR fornisce diversi metodi per modificare direttamente l'ordine di visualizzazione delle finestre. Potete spostare una finestra in primo piano o sullo sfondo nell'ordine di visualizzazione; potete spostare una finestra sopra o dietro un'altra finestra. Allo stesso tempo, l'utente può riordinare le finestre attivandole.

Potete tenere una finestra in primo piano rispetto alle altre finestre impostando la sua proprietà alwaysInFront su true . Se più finestre hanno questa impostazione, l'ordine di visualizzazione di queste finestre è definito tra loro stesse, ma comunque sempre sopra le finestre la cui proprietà alwaysInFront è impostata su false.

Le finestre nel gruppo in primo piano sono sempre visualizzate sopra le finestre di altre applicazioni, anche quando l'applicazione AIR non è attiva. Poiché questo comportamento può disturbare il lavoro dell'utente, è opportuno impostare alwaysInFront su true solo quando è necessario e appropriato. Esempi di uso giustificato includono:

  • Finestre popup temporanee per controlli quali descrizioni comandi, elenchi popup, menu personalizzati o caselle combinate. Poiché queste finestre si devono chiudere quando non sono più attive, è possibile evitare di bloccare la visualizzazione di altre finestre.

  • Messaggi di errore e avvisi estremamente urgenti. Se la mancata risposta dell'utente in un tempo utile causa una modifica irrevocabile, potrebbe essere giustificato visualizzare una finestra di avviso in primo piano. Tuttavia, la maggior parte degli errori e avvisi può essere gestito nel normale ordine di visualizzazione delle finestre.

  • Finestre stile toast momentanee.

Nota: AIR non impone il corretto utilizzo della proprietà alwaysInFront . Tuttavia, se l'applicazione disturba il flusso di lavoro di un utente, è probabile che finisca nel cestino.

Se una finestra è proprietaria di altre finestre, tali finestre sono sempre ordinate davanti ad essa. Se chiamate orderToFront() o impostate alwaysInFront su true su una finestra proprietaria di altre finestre, le finestre di proprietà vengono riordinate insieme con la finestra proprietaria, ma vengono ancora visualizzate davanti al proprietario.

La chiamata ai metodi di ordinamento finestre su finestre di proprietà funziona normalmente tra finestre di proprietà della stessa finestra, ma può anche modificare l'ordine dell'intero gruppo di finestre di proprietà rispetto alle finestre esterne al gruppo. Ad esempio, se chiamate orderToFront() su una finestra di proprietà, tale finestra, il suo proprietario e qualsiasi altra finestra di proprietà dallo stesso proprietario vengono spostate davanti all'ordine di visualizzazione finestre.

La classe NativeWindow fornisce le proprietà e i metodi seguenti per l'impostazione dell'ordine di visualizzazione di una finestra in relazione alle altre finestre:

Membro

Descrizione

proprietà alwaysInFront

Specifica se la finestra è visualizzata nel gruppo di finestre in primo piano.

In quasi tutti i casi, false è la migliore impostazione. Modificando il valore da false a true , la finestra viene portata in primo piano rispetto a tutte le altre finestre (senza che venga attivata). Modificando il valore da true a false , la finestra viene portata in secondo piano rispetto alle finestre restanti nel gruppo in primo piano, ma ancora in primo piano rispetto alle altre finestre. Se si imposta la proprietà sul suo valore corrente per una finestra, l'ordine di visualizzazione delle finestre non cambia.

L'impostazione alwaysInFront non ha effetto su finestre di proprietà di un'altra finestra.

orderToFront()

Porta la finestra in primo piano.

orderInFrontOf()

Porta la finestra direttamente in primo piano rispetto a una particolare finestra.

orderToBack()

Manda la finestra in secondo piano rispetto alle altre finestre.

orderBehind()

Manda la finestra direttamente in secondo piano rispetto a una particolare finestra.

activate()

Porta la finestra in primo piano (oltre a renderla visibile e attiva).

Nota: se una finestra è nascosta ( visible è false ) o ridotta a icona, la chiamata dei metodi di ordinamento della visualizzazione non ha effetto.

Nel sistema operativo Linux, diversi gestori di finestre applicano regole diverse per quanto riguarda l'ordine di visualizzazione delle finestre:

  • In alcuni gestori di finestre, le finestre di utilità vengono visualizzate in primo piano rispetto alle finestre normali.

  • In alcuni gestori di finestre, una finestra a schermo intero con la proprietà alwaysInFront impostata su true viene sempre visualizzata in primo piano rispetto ad altre finestre la cui proprietà alwaysInFront è impostata su true .

Chiusura di una finestra

Per chiudere una finestra, potete utilizzare il metodo NativeWindow.close() .

La chiusura di una finestra consente di scaricane il contenuto, ma se altri oggetti contengono riferimenti a questo contenuto, gli oggetti contenuto non vengono distrutti. Il metodo NativeWindow.close() viene eseguito in maniera asincrona, l'applicazione contenuta nella finestra continua a essere eseguita durante il processo di chiusura. Il metodo close invia un evento close quando l'operazione di chiusura è terminata. L'oggetto NativeWindow è ancora tecnicamente valido, ma l'accesso alla maggior parte delle proprietà e dei metodi di una finestra chiusa genera un IllegalOperationError. Non potete riaprire una finestra chiusa. Potete verificare se una finestra è stata chiusa controllando la proprietà closed . Per nascondere una finestra, potete impostare la proprietà NativeWindow.visible su false .

Se la proprietà Nativeapplication.autoExit è true (impostazione predefinita), l'applicazione esce quando viene chiusa l'ultima finestra.

Eventuali finestre di proprietà vengono chiuse quando si chiude il proprietario. Le finestre di proprietà non inviano un evento di chiusura e pertanto non possono impedire la chiusura. Un evento close viene inviato.

Annullamento delle operazioni sulla finestra

Quando una finestra utilizza il chrome di sistema, l'interazione con l'utente può essere annullata intercettando e annullando il comportamento predefinito degli eventi appropriati. Ad esempio, se un utente fa clic sul pulsante di chiusura del chrome di sistema, viene inviato l'evento closing . Se qualsiasi listener registrato chiama il metodo preventDefault() dell'evento, la finestra non si chiude.

Se una finestra non utilizza il chrome di sistema, gli eventi di notifica per le modifiche designate non vengono inviati automaticamente prima che venga apportata la modifica. Pertanto, se si chiamano i metodi per chiudere una finestra, modificare lo stato della finestra o impostare le proprietà dei limiti della finestra, la modifica non può essere annullata. Per inviare notifiche ai componenti dell'applicazione prima di apportare una modifica alla finestra, la logica dell'applicazione può inviare l'evento di notifica relativo utilizzando il metodo dispatchEvent() della finestra.

Ad esempio, la logica seguente implementa un gestore eventi annullabile per un pulsante di chiusura della finestra:

public function onCloseCommand(event:MouseEvent):void{ 
    var closingEvent:Event = new Event(Event.CLOSING,true,true); 
    dispatchEvent(closing); 
    if(!closingEvent.isDefaultPrevented()){ 
        win.close(); 
    } 
} 

Il metodo dispatchEvent() restituisce false se il metodo preventDefault() dell'evento viene chiamato da un listener. Tuttavia, può anche restituire false per altri motivi, pertanto è preferibile utilizzare in modo esplicito il metodo isDefaultPrevented() per verificare se la modifica deve essere annullata.

Ingrandimento, riduzione a icona e ripristino di una finestra

Per ingrandire la finestra, potete utilizzare il metodo maximize() della classe NativeWindow.

myWindow.maximize(); 

Per ridurre a icona la finestra, potete utilizzare il metodo minimize() della classe NativeWindow.

myWindow.minimize(); 

Per ripristinare la finestra (ovvero, riportarla alle dimensioni che aveva prima di essere ridotta a icona o ingrandita), potete utilizzare il metodo restore() della classe NativeWindow.

myWindow.restore(); 

Una finestra di proprietà viene ridotta a icona e ripristinata quando la finestra a cui è associata viene ridotta a icona o ripristinata. Nessun evento viene inviato dalla finestra di proprietà quando viene ridotta a icona perché il suo proprietario viene ridotto a icona.

Nota: il comportamento che deriva dall'ingrandimento di una finestra AIR è diverso dal comportamento standard di Mac OS X. Anziché passare da una dimensione “standard” definita dall'applicazione all'ultima dimensione impostata dall'utente, e viceversa, le finestre AIR passano dall'ultima dimensione impostata dall'applicazione o dall'utente all'area utilizzabile dello schermo, e viceversa.

Nel sistema operativo Linux, diversi gestori di finestre applicano regole diverse per quanto riguarda l'impostazione dello stato di visualizzazione delle finestre:

  • In alcuni gestori di finestre, le finestre di utilità non possono essere ingrandite.

  • Se vengono impostate le dimensioni massime per la finestra, alcune finestre non consentono l'ingrandimento. Altri gestori di finestre impostano lo stato di visualizzazione su ingrandita, ma non ridimensionano la finestra. In entrambi i casi, non viene inviato alcun evento di modifica dello stato.

  • Alcuni gestori di finestre non rispettano l'impostazione maximizable o minimizable relativa alle finestre.

Nota: in Linux, le proprietà delle finestre vengono modificate in modo asincrono. Se modificate lo stato di visualizzazione in una riga del programma e leggete il valore nella riga successiva, il valore letto continua a riflettere l'impostazione precedente. Su tutte le piattaforme, l'oggetto NativeWindow invia l'evento displayStateChange quando lo stato di visualizzazione cambia. Se dovete intraprendere azioni basate sul nuovo stato della finestra, fatelo sempre in un gestore di eventi displayStateChange . Vedete Intercettazione degli eventi della finestra .

Esempio: riduzione a icona, ingrandimento, ripristino e chiusura di una finestra

Nella breve applicazione MXML seguente vengono dimostrati i metodi maximize() , minimize() , restore() e close() della finestra:

<?xml version="1.0" encoding="utf-8"?> 
 
<mx:WindowedApplication  
    xmlns:mx="http://www.adobe.com/2006/mxml"  
    layout="vertical"> 
     
     
    <mx:Script> 
    <![CDATA[ 
    public function minimizeWindow():void 
    { 
        this.stage.nativeWindow.minimize(); 
    } 
 
    public function maximizeWindow():void 
    { 
        this.stage.nativeWindow.maximize(); 
    }           
     
    public function restoreWindow():void 
    { 
        this.stage.nativeWindow.restore(); 
    }           
 
    public function closeWindow():void 
    { 
        this.stage.nativeWindow.close(); 
    } 
    ]]> 
    </mx:Script> 
 
    <mx:VBox> 
        <mx:Button label="Minimize" click="minimizeWindow()"/> 
        <mx:Button label="Restore" click="restoreWindow()"/> 
        <mx:Button label="Maximize" click="maximizeWindow()"/> 
        <mx:Button label="Close" click="closeWindow()"/> 
    </mx:VBox> 
 
</mx:WindowedApplication>

L'esempio ActionScript seguente per Flash crea quattro campi di testo selezionabili che attivano i metodi minimize() , maximize() , restore() e close() della classe NativeWindow:

package 
{ 
    import flash.display.Sprite; 
    import flash.events.MouseEvent; 
    import flash.text.TextField; 
     
    public class MinimizeExample extends Sprite 
    { 
        public function MinimizeExample():void  
        { 
            var minTextBtn:TextField = new TextField(); 
            minTextBtn.x = 10; 
            minTextBtn.y = 10; 
            minTextBtn.text = "Minimize"; 
            minTextBtn.background = true; 
            minTextBtn.border = true; 
            minTextBtn.selectable = false; 
            addChild(minTextBtn); 
            minTextBtn.addEventListener(MouseEvent.CLICK, onMinimize); 
         
            var maxTextBtn:TextField = new TextField(); 
            maxTextBtn.x = 120; 
            maxTextBtn.y = 10; 
            maxTextBtn.text = "Maximize"; 
            maxTextBtn.background = true; 
            maxTextBtn.border = true; 
            maxTextBtn.selectable = false; 
            addChild(maxTextBtn); 
            maxTextBtn.addEventListener(MouseEvent.CLICK, onMaximize); 
         
            var restoreTextBtn:TextField = new TextField(); 
            restoreTextBtn.x = 230; 
            restoreTextBtn.y = 10; 
            restoreTextBtn.text = "Restore"; 
            restoreTextBtn.background = true; 
            restoreTextBtn.border = true; 
            restoreTextBtn.selectable = false; 
            addChild(restoreTextBtn); 
            restoreTextBtn.addEventListener(MouseEvent.CLICK, onRestore); 
             
            var closeTextBtn:TextField = new TextField(); 
            closeTextBtn.x = 340; 
            closeTextBtn.y = 10; 
            closeTextBtn.text = "Close Window"; 
            closeTextBtn.background = true; 
            closeTextBtn.border = true; 
            closeTextBtn.selectable = false; 
            addChild(closeTextBtn); 
            closeTextBtn.addEventListener(MouseEvent.CLICK, onCloseWindow); 
        } 
        function onMinimize(event:MouseEvent):void 
        { 
            this.stage.nativeWindow.minimize(); 
        } 
        function onMaximize(event:MouseEvent):void 
        { 
            this.stage.nativeWindow.maximize(); 
        } 
        function onRestore(event:MouseEvent):void 
        { 
            this.stage.nativeWindow.restore(); 
        } 
        function onCloseWindow(event:MouseEvent):void 
        { 
            this.stage.nativeWindow.close(); 
        } 
    } 
}

Ridimensionamento e spostamento di una finestra

Il chrome di sistema di una finestra fornisce i controlli di trascinamento per il ridimensionamento e lo spostamento della finestra sul desktop. Se una finestra non utilizza il chrome di sistema, occorre aggiungere controlli personalizzati per consentire all'utente di ridimensionare e spostare la finestra.

Nota: prima di ridimensionare o spostare una finestra, occorre ottenere un riferimento all'istanza NativeWindow. Per informazioni su come ottenere un riferimento alla finestra, consultate Ottenere un'istanza NativeWindow .

Ridimensionamento di una finestra

Per consentire all'utente di ridimensionare una finestra in modo interattivo, usate il metodo startResize() della classe NativeWindow. Quando questo metodo viene chiamato da un evento mouseDown , l'operazione di ridimensionamento viene guidata dal mouse e terminata quando il sistema riceve un evento mouseUp . La chiamata al metodo startResize() prevede il passaggio di un argomento che specifica il bordo o l'angolo da cui ridimensionare la finestra.

Per impostare le dimensioni della finestra a livello di codice, impostate la proprietà width , height o bounds della finestra sulle dimensioni desiderate. Quando impostate i limiti, potete modificare contemporaneamente sia le dimensioni che la posizione della finestra. Non è tuttavia garantito l'ordine in cui vengono applicate le modifiche. Alcuni gestori di finestre in Linux non consentono l'estensione delle finestra oltre i limiti dello schermo del desktop. In questi casi, le dimensioni finali della finestra possono essere limitate a causa dell'ordine in cui vengono impostate le proprietà, anche se l'effetto delle modifiche avrebbe, diversamente, prodotto una finestra valida. Se, ad esempio, modificate sia l'altezza che la posizione y di una finestra vicina alla parte inferiore dello schermo, la modifica dell'altezza completa potrebbe non avvenire se viene applicata prima della modifica della posizione y.

Nota: in Linux, le proprietà delle finestre vengono modificate in modo asincrono. Se ridimensionate una finestra in una riga del programma e leggete le dimensioni in quella successiva, queste riflettono ancora le vecchie impostazioni. Su tutte le piattaforme, l'oggetto NativeWindow invia l'evento resize quando cambiano le dimensioni della finestra. Se dovete intraprendere delle azioni, ad esempio disporre i controlli nella nuova finestra, in base alle nuove dimensioni o stato della finestra, fatelo sempre in un gestore di eventi resize . Vedete Intercettazione degli eventi della finestra .

La modalità scala dello stage determina il comportamento dello stage della finestra e del suo contenuto quando una finestra viene ridimensionata. Tenete presente che le modalità scala dello stage sono progettate per situazioni, come un browser Web, in cui l'applicazione non controlla le dimensioni o le proporzioni del suo spazio di visualizzazione. In generale, potete ottenere i risultati migliori impostando la proprietà scaleMode dello stage su StageScaleMode.NO_SCALE . Se desiderate che il contenuto della finestra venga ridimensionato, potete ancora impostare i parametri scaleX e scaleY del contenuto in risposta alle modifiche dei limiti della finestra.

Spostamento di una finestra

Per spostare una finestra senza ridimensionarla, potete utilizzare il metodo NativeWindow startMove() . Analogamente al metodo startResize() , quando il metodo startMove() viene chiamato da un evento mouseDown , il processo di spostamento è guidato dal mouse e termina quando il sistema operativo riceve un evento mouseUp .

Per ulteriori informazioni sui metodi startResize() e startMove() , vedete la Guida di riferimento di Adobe ActionScript 3.0 per la piattaforma Adobe Flash .

Per spostare una finestra a livello di programma, impostate le proprietà x , y o bounds della finestra nella posizione desiderata. Quando impostate i limiti, potete modificare contemporaneamente sia le dimensioni che la posizione della finestra.

Nota: in Linux, le proprietà delle finestre vengono modificate in modo asincrono. Se spostate una finestra in una riga del programma e leggete la posizione nella riga successiva, il valore letto continua a riflettere l'impostazione precedente. Su tutte le piattaforme, l'oggetto NativeWindow invia l'evento move quando la posizione cambia. Se dovete intraprendere azioni basate sulla nuova posizione della finestra, fatelo sempre in un gestore di eventi move . Vedete Intercettazione degli eventi della finestra .

Esempio: ridimensionamento e spostamento di finestre

L'esempio seguente mostra come avviare le operazioni di ridimensionamento e spostamento in una finestra:

package 
{ 
    import flash.display.Sprite; 
    import flash.events.MouseEvent; 
    import flash.display.NativeWindowResize; 
 
    public class NativeWindowResizeExample extends Sprite 
    { 
        public function NativeWindowResizeExample():void 
        { 
            // Fills a background area. 
            this.graphics.beginFill(0xFFFFFF); 
            this.graphics.drawRect(0, 0, 400, 300); 
            this.graphics.endFill(); 
     
            // Creates a square area where a mouse down will start the resize. 
            var resizeHandle:Sprite =  
                createSprite(0xCCCCCC, 20, this.width - 20, this.height - 20); 
            resizeHandle.addEventListener(MouseEvent.MOUSE_DOWN, onStartResize); 
     
            // Creates a square area where a mouse down will start the move. 
            var moveHandle:Sprite = createSprite(0xCCCCCC, 20, this.width - 20, 0); 
            moveHandle.addEventListener(MouseEvent.MOUSE_DOWN, onStartMove); 
        } 
     
        public function createSprite(color:int, size:int, x:int, y:int):Sprite 
        { 
            var s:Sprite = new Sprite(); 
            s.graphics.beginFill(color); 
            s.graphics.drawRect(0, 0, size, size); 
            s.graphics.endFill(); 
            s.x = x; 
            s.y = y; 
            this.addChild(s);     
            return s;         
        } 
     
        public function onStartResize(event:MouseEvent):void 
        { 
            this.stage.nativeWindow.startResize(NativeWindowResize.BOTTOM_RIGHT); 
        } 
 
        public function onStartMove(event:MouseEvent):void 
        { 
            this.stage.nativeWindow.startMove(); 
        } 
    } 
}