Hantera fönster

Adobe AIR 1.0 och senare

Du använder egenskaperna och metoderna i klassen NativeWindow för att hantera utseendet, funktionerna och livscykeln för skrivbordsfönster.

Obs! Det är oftast bättre att hantera fönsterbeteendet med hjälp av framework-klasser när du använder Flex-ramverket. De flesta NativeWindow-egenskaperna och -metoderna är tillgängliga via klasserna mx:WindowedApplication och mx:Window.

Hämta en NativeWindow-instans

Om du ska kunna ändra ett fönster måste du först hämta fönsterinstansen. Du kan hämta en fönsterinstans från någon av följande platser:

  • Den konstruktor för inbyggda fönster som användes för att skapa fönstret:

    var win:NativeWindow = new NativeWindow(initOptions);
  • nativeWindow -egenskapen för fönsterscenen:

    var win:NativeWindow = stage.nativeWindow;
  • stage -egenskapen för ett visningsobjekt i fönstret:

    var win:NativeWindow = displayObject.stage.nativeWindow;
  • target -egenskapen för en händelse för inbyggda fönster som skickas av fönstret:

    private function onNativeWindowEvent(event:NativeWindowBoundsEvent):void 
    { 
        var win:NativeWindow = event.target as NativeWindow; 
    }
  • nativeWindow -egenskapen för en HTML-sida som visas i fönstret:

    var win:NativeWindow = htmlLoader.window.nativeWindow;
  • activeWindow - och openedWindows -egenskaperna för NativeApplication-objektet:

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

    NativeApplication.nativeApplication.activeWindow refererar till det aktiva fönstret för ett program (men returnerar null om det aktiva fönstret inte är ett fönster för det här AIR-programmet). NativeApplication.nativeApplication.openedWindows -arrayen innehåller alla fönster i ett AIR-program som inte har stängts.

Eftersom Flex-objekten mx:WindowedApplication och mx:Window är visningsobjekt kan du enkelt referera till programfönstret i en MXML-fil med hjälp av egenskapen stage , enligt följande:

<?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
Obs! Innan komponenten WindowedApplication eller Window har lagts till på fönsterscenen av Flex Framework har egenskapen stage för komponenten värdet null . Det här fungerar på samma sätt som med komponenten Flex Application, men innebär också att det inte går att komma åt scenen eller NativeWindow-instansen i lyssnare för händelser som inträffar tidigare i initieringscykeln för komponenterna WindowedApplication och Window, till exempel creationComplete . Det går att komma åt scenen och NativeWindow-instansen utan risk när händelsen applicationComplete har skickats.

Aktivera, visa och dölja fönster

Du aktiverar ett fönster genom att anropa NativeWindow-metoden activate() . När ett fönster aktiveras placeras det överst, kommer i fokus för tangentbordet och musen och, om det behövs, görs synligt genom att det återställs eller genom att egenskapen visible anges till true . Ordningen för övriga fönster i programmet ändras inte när ett fönster aktiveras. När metoden activate() anropas skickar fönstret en activate -händelse.

Om du vill visa ett dolt fönster utan att aktivera det anger du egenskapen visible till true . Detta placerar fönstret överst, men tilldelar inte fönstret fokus.

Om du vill dölja ett fönster anger du egenskapen visible för fönstret till false . När ett fönster döljs inaktiveras visningen av såväl fönstret som eventuella ikoner i Aktivitetsfältet och, i Mac OS X, menyalternativet på Fönster-menyn.

När du ändrar synligheten för ett fönster ändras även synligheten för fönster som ägs av det fönstret. Om du till exempel döljer ett fönster, döljs även alla fönster som ägs av det fönstret.

Obs! I Mac OS X går det inte att helt dölja ett minimerat fönster som har en ikon som visas i fönsterdelen av Dock. Om egenskapen visible har angetts till false för ett minimerat fönster visas fortfarande dockningsikonen för fönstret. Om användaren klickar på ikonen återställs fönstret till ett synligt läge och visas.

Ändra visningsordningen för fönster

AIR innehåller flera metoder för att ändra visningsordningen för fönster direkt. Du kan placera ett fönster överst eller underst i visningsordningen och du kan placera ett fönster framför eller bakom ett annat fönster. Samtidigt kan användaren ändra ordningen för fönstren genom att aktivera dem.

Du kan behålla ett fönster framför andra fönster genom att ange egenskapen alwaysInFront för det till true . Om fler än ett fönster har den här inställningen sorteras de fönstren efter den inbördes visningsordningen, men de hamnar alltid framför fönster som har egenskapen alwaysInFront angiven till false.

Fönster i den översta gruppen visas också framför fönster i andra program, även om AIR-programmet inte är aktivt. Eftersom detta kan vara störande för användaren bör alwaysInFront endast anges till true när detta är nödvändigt och lämpligt. Det kan till exempel vara befogat i följande fall:

  • För tillfälliga popup-fönster för kontroller som knappbeskrivningar, popup-listor, anpassade menyer eller kombinationsrutor. Eftersom de här fönstren stängs när de förlorar fokus undviks irritationsmomentet att en användare inte kan visa ett annat fönster.

  • För extremt angelägna felmeddelanden och varningar. När en oåterkallelig ändring kan utföras om användaren inte agerar i tid kan det vara befogat att placera ett varningsfönster längst fram. De flesta fel och varningar kan emellertid hanteras i den normala fönstervisningsordningen.

  • Enkla meddelandefönster med kort varaktighet.

Obs! Det finns inga begränsningar i AIR för hur egenskapen alwaysInFront kan användas, men om ditt program stör en användare i arbetet kommer det troligen att hamna i användarens papperskorg.

Om ett fönster äger andra fönster ordnas de ägda fönstren alltid framför det. Om du anropar orderToFront() eller anger alwaysInFront som true för ett fönster som äger andra fönster, så ordnas de ägda fönstren om tillsammans med det ägande fönstret framför andra fönster, men de ägda fönstren visas fortfarande framför det ägande huvudfönstret.

Att anropa fönsterordningsmetoder för ägda fönster fungerar normalt bland fönster som ägs av samma huvudfönster, men det kan även ändra ordningen för hela gruppen med ägda fönster i förhållande till fönster utanför gruppen. Om du till exempel anropar orderToFront() för ett ägt fönster flyttas både det fönstret, dess ägare och alla andra fönster som ägs av samma ägare längst fram i fönstervisningsordningen.

Klassen NativeWindow innehåller följande egenskaper och metoder för att ange visningsordningen för ett fönster i förhållande till andra fönster:

Medlem

Beskrivning

Egenskapen alwaysInFront

Anger huruvida fönstret visas i den översta gruppen med fönster.

I nästan alla fall är false den bästa inställningen. Om värdet ändras från false till true placeras fönstret framför alla andra fönster (men det aktiveras inte). Om värdet ändras från true till false placeras fönstret bakom fönster som är kvar i den översta gruppen, men fortfarande framför andra fönster. Om egenskapen anges till det aktuella värdet för ett fönster ändras inte fönstervisningsordningen.

Inställningen alwaysInFront har ingen effekt på fönster som ägs av ett annat fönster.

orderToFront()

Placerar fönstret längst fram.

orderInFrontOf()

Placerar fönstret omedelbart framför ett visst fönster.

orderToBack()

Placerar fönstret bakom andra fönster.

orderBehind()

Placerar fönstret omedelbart bakom ett visst fönster.

activate()

Placerar fönstret längst fram (och gör fönstret synligt och tilldelar det fokus).

Obs! Om ett fönster är dolt ( visible är false ) eller minimerat händer inget när visningsordningsmetoderna anropas.

I Linux-operativsystemet tillämpar olika fönsterhanterare olika regler för fönstrens visningsordning:

  • I vissa fönsterhanterare visas verktygsfönster alltid framför vanliga fönster.

  • I vissa fönsterhanterare visas helskärmsfönster som har en alwaysInFront -egenskap med värdet true alltid framför andra fönster som också har alwaysInFront angivet till true .

Stänga ett fönster

Om du vill stänga ett fönster använder du metoden NativeWindow.close() .

När ett fönster stängs tas innehållet bort från fönstret, men om andra objekt har referenser till innehållet förstörs inte innehållsobjekten. Metoden NativeWindow.close() körs asynkront och det program fönstret innehåller fortsätter att köras under stängningsprocessen. Metoden close() skickar en close-händelse när åtgärden har slutförts. NativeWindow-objektet är i princip fortfarande giltigt, men för de flesta egenskaper och metoder för ett stängt fönster genereras felet IllegalOperationError vid försök till åtkomst. Du kan inte öppna ett stängt fönster på nytt. Kontrollera egenskapen closed för ett fönster om du vill testa huruvida fönstret har stängts. Om du bara vill dölja ett fönster anger du egenskapen NativeWindow.visible till false .

Om egenskapen Nativeapplication.autoExit har värdet true , vilket är standardinställningen, avslutas programmet när dess sista fönster stängs.

Alla fönster som har en ägare stängs när ägarfönstret stängs. De ägda fönstren skickar inga closing-händelser och kan därför inte förhindra stängningen. En close-händelse skickas.

Tillåta att fönsteråtgärder avbryts

När ett fönster använder systemfönsterstandard kan användaråtgärder i fönstret avbrytas genom att lämpliga händelser avlyssnas och deras standardfunktioner förhindras. När en användare exempelvis klickar på stängningsknappen för systemfönsterstandarden, skickas händelsen closing . Om en registrerad lyssnare anropar metoden preventDefault() för händelsen stängs inte fönstret.

När ett fönster inte använder systemfönsterstandard skickas inte automatiskt meddelandehändelser gällande förestående ändringar innan ändringarna utförs. Om du anropar metoderna för att stänga ett fönster, ändrar fönsterstatus eller anger någon av egenskaperna för fönstergränserna går det därför inte att avbryta ändringen. Om du vill skicka meddelanden till komponenter i programmet innan en fönsterändring utförs, kan programlogiken skicka den relevanta meddelandehändelsen med hjälp av metoden dispatchEvent() för fönstret.

Exempelvis implementerar följande logik en händelsehanterare som kan avbrytas för en stängningsknapp i ett fönster:

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

Metoden dispatchEvent() returnerar false om metoden preventDefault() för händelsen anropas av en lyssnare. Den kan emellertid också returnera false av andra orsaker, så det är bättre att uttryckligen använda metoden isDefaultPrevented() för att testa huruvida ändringen ska avbrytas.

Maximera, minimera och återställa ett fönster

Om du vill maximera fönstret använder du NativeWindow-metoden maximize() .

myWindow.maximize(); 

Om du vill minimera fönstret använder du NativeWindow-metoden minimize() .

myWindow.minimize(); 

Om du vill återställa fönstret (det vill säga ändra tillbaka till den storlek fönstret hade innan det minimerades eller maximerades) använder du NativeWindow-metoden restore() .

myWindow.restore(); 

Ett fönster som har en ägare minimeras och återställs när det ägande fönstret minimeras och återställs. Inga händelser skickas av det ägda fönstret när det minimeras på grund av att ägaren minimeras.

Obs! När ett AIR-fönster maximeras fungerar det inte på det sätt som är standard i Mac OS X. I stället för att växla mellan en programdefinierad ”standardstorlek” och den senaste storlek som angavs av användaren, växlar AIR-fönster mellan den senaste storlek som angavs av programmet eller användaren och hela det tillgängliga skärmområdet.

I Linux-operativsystemet tillämpar olika fönsterhanterare olika regler för fönstrens visningsläge:

  • I vissa fönsterhanterare går det inte att maximera verktygsfönster.

  • Om en största storlek har angetts för fönstret går det inte att maximera vissa fönster. I andra fönsterhanterare är fönstren maximerade, och det går inte att ändra storlek på dem. Ingen händelse för ändrat visningsläge skickas i något av dessa fall.

  • En del fönsterhanterare respekterar inte fönsterinställningarna maximizable och minimizable .

Obs! I Linux ändras fönsteregenskaper asynkront. Om du ändrar visningsläget på en rad i programmet och läser värdet på nästa rad, så kommer värdet fortfarande att återspegla den gamla inställningen. På alla plattformar skickar NativeWindow-objektet händelsen displayStateChange när visningsläget ändras. Om du behöver utföra någon åtgärd baserat på det nya fönsterläget ska du alltid göra det i en displayStateChange -händelsehanterare. Mer information finns i Avlyssna fönsterhändelser .

Exempel: Minimera, maximera, återställa och stänga ett fönster

Med följande korta MXML-program demonstreras Window-metoderna maximize() , minimize() , restore() och close() :

<?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>

I följande ActionScript-exempel för Flash skapas fyra klickbara textfält som utlöser NativeWindow-metoderna minimize() , maximize() , restore() och close() :

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

Ändra storlek på och flytta ett fönster

När ett fönster använder systemfönsterstandard tillhandahåller systemfönsterstandarden kontroller för att ändra storlek på fönstret och flytta runt det på skrivbordet. Om ett fönster inte använder systemfönsterstandard måste du lägga till egna kontroller för att användaren ska kunna ändra storlek på och flytta fönstret.

Obs! Om du vill ändra storlek på eller flytta ett fönster måste du först hämta en referens till NativeWindow-instansen. Information om hur du hämtar en fönsterreferens finns i Hämta en NativeWindow-instans .

Ändra storlek på ett fönster

Om du vill att användaren ska kunna ändra storlek på fönstret interaktivt använder du NativeWindow-metoden startResize() . När den här metoden anropas från en mouseDown -händelse är storleksändringsåtgärden beroende av musen och slutförs när operativsystemet tar emot en mouseUp -händelse. När du anropar startResize() skickar du ett argument som anger den kant eller det hörn som fönstret ska storleksändras utifrån.

Om du vill ställa in fönsterstorleken programmatiskt anger du fönsteregenskaperna width , height eller bounds till önskade mått. Om du anger bounds (gränser) kan fönstrets storlek och placering ändras samtidigt. Det går emellertid inte att försäkra i vilken ordning ändringarna görs. En del Linux-fönsterhanterare tillåter inte att fönstren överskrider skärmens yttre gränser. Detta innebär att den slutgiltiga fönsterstorleken kan begränsas beroende på i vilken ordning som egenskaperna anges, även om effekten av ändringarna egentligen resulterar i ett giltigt fönster. Om du exempelvis ändrar fönstrets höjd och vågräta placering vid skärmens nedre kant, kanske den fullständiga höjden inte kan tillämpas om höjdändringen tillämpas innan den vågräta placeringen ändras.

Obs! I Linux ändras fönsteregenskaper asynkront. Om du ändrar storlek på ett fönster på en rad i programmet och läser dimensionerna på en annan rad, kommer de fortfarande att återspegla de gamla inställningarna. På alla plattformar skickar NativeWindow-objektet händelsen resize när fönstret ändrar storlek. Om du behöver utföra någon åtgärd, till exempel placera kontroller i fönstret, baserat på den nya storleken eller det nya fönsterläget ska du alltid göra det i en resize -händelsehanterare. Mer information finns i Avlyssna fönsterhändelser .

Scenens skalningsläge styr hur fönsterscenen och dess innehåll påverkas när ett fönster storleksändras. Kom ihåg att scenskalningslägena har utformats för situationer, till exempel i en webbläsare, där storleken eller proportionerna på visningsområdet inte styrs av programmet. Oftast får du de bästa resultaten genom att ange egenskapen scaleMode för scenen till StageScaleMode.NO_SCALE . Om du vill att innehållet i fönstret ska skalas kan du fortfarande ange parametrarna scaleX och scaleY för innehållet beroende på hur fönstergränserna ändras.

Flytta ett fönster

Om du vill flytta ett fönster utan att ändra storlek på det använder du NativeWindow-metoden startMove() . När metoden startMove() anropas från en mouseDown -händelse är flyttprocessen beroende av musen och slutförs när operativsystemet tar emot en mouseUp -händelse, precis som med metoden startResize() .

Mer information om metoderna startResize() och startMove() finns i Referenshandbok för ActionScript 3.0 i Adobe Flash-plattformen .

Om du vill flytta ett fönster med hjälp av programmering anger du egenskaperna x , y eller bounds för fönstret till önskad position. Om du anger bounds (gränser) kan både fönstrets storlek och placering ändras samtidigt.

Obs! I Linux ändras fönsteregenskaper asynkront. Om du flyttar ett fönster på en rad i programmet och läser positionen på nästa rad, så kommer värdet fortfarande att återspegla den gamla inställningen. På alla plattformar skickar NativeWindow-objektet händelsen move när placeringen ändras. Om du behöver utföra någon åtgärd baserat på den nya placeringen ska du alltid göra det i en move -händelsehanterare. Mer information finns i Avlyssna fönsterhändelser .

Exempel: Ändra storlek på och flytta fönster

Följande exempel visar hur du initierar storleksändrings- och flyttåtgärder i ett fönster:

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