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