Gestión de ventanas

Adobe AIR 1.0 y posterior

Puede utilizar las propiedades y métodos de la clase NativeWindow para gestionar el aspecto, el comportamiento y el ciclo de vida de las ventanas de escritorio.

Nota: al utilizar Flex, suele ser mejor administrar el comportamiento de la ventana utilizando las clases de la arquitectura. A la mayoría de los métodos y propiedades de NativeWindow se puede acceder mediante las clases mx:WindowedApplication y mx:Window.

Obtención de una instancia de NativeWindow

Para poder manipular una ventana, primero es necesario obtener la instancia de la ventana. Puede obtener una instancia de ventana de uno de los lugares siguientes:

  • El constructor de ventanas nativas utilizado para crear la ventana:

    var win:NativeWindow = new NativeWindow(initOptions);
  • Propiedad nativeWindow del escenario de la ventana:

    var win:NativeWindow = stage.nativeWindow;
  • Propiedad stage de un objeto de visualización en la ventana:

    var win:NativeWindow = displayObject.stage.nativeWindow;
  • Propiedad target de un evento de ventana nativa distribuido por la ventana:

    private function onNativeWindowEvent(event:NativeWindowBoundsEvent):void 
    { 
        var win:NativeWindow = event.target as NativeWindow; 
    }
  • Propiedad nativeWindow de una página HTML mostrara en la ventana:

    var win:NativeWindow = htmlLoader.window.nativeWindow;
  • Propiedades activeWindow y openedWindows del objeto NativeApplication:

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

    NativeApplication.nativeApplication.activeWindow hace referencia a la ventana activa de una aplicación (pero devuelve null si la ventana activa no es una ventana de esta aplicación de AIR). El conjunto NativeApplication.nativeApplication.openedWindows contiene todas las ventanas de una aplicación de AIR que no se han cerrado.

Dado que los objetos Application, WindowedApplication y Window de Flex son objetos de visualización a los que es muy sencillo hacer referencia a la ventana de aplicación desde un archivo MXML mediante la propiedad stage , como puede verse a continuación:

<?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: hasta que se añade el componente WindowedApplication o Window al escenario de la ventana por la arquitectura de Flex, la propiedad stage del componente es null . Este comportamiento es coherente con el del componente Application de Flex, pero no significa que sea imposible acceder al escenario o a la instancia de NativeWindow en detectores de eventos anteriores al ciclo de inicialización de los componentes WindowedApplication y Window, por ejemplo, creationComplete . Es seguro acceder al escenario y a la instancia de NativeWindow cuando se distribuye el evento applicationComplete .

Activación, visualización y ocultación de ventanas

Para activar una ventana, llame al método activate() de NativeWindow. Al activar una ventana, esta se visualiza en primer plano, recibe la selección del teclado y del ratón y, si es necesario, se hace visible restaurando la ventana o estableciendo la propiedad visible como true . Cuando se activa una ventana, esta no cambia el orden del resto de ventanas de la aplicación. Si se llama al método activate() , la ventana distribuye un evento activate .

Para mostrar una ventana oculta sin activarla, establezca la propiedad visible como true . Esto llevará la ventana al primer plano, pero no recibirá la selección.

Para ocultar la visibilidad de una ventana, establezca su propiedad visible como false . Al ocultar una ventana, se suprime la visualización de la ventana, de los iconos relacionados de la barra de tareas y, en Mac OS X, la entrada del menú Ventana.

Cuando se cambia la visibilidad de una ventana, la visibilidad de cualquier ventana contenida en esa ventana también cambia. Por ejemplo, si se oculta una ventana, todas sus ventanas incluidas también se ocultan.

Nota: en Mac OS X, no es posible ocultar por completo una ventana minimizada que tenga un icono en la parte de venta del dock. Si la propiedad visible se establece como false en una ventana minimizada, el icono del Dock de dicha ventana sigue visualizándose. Si el usuario hace clic en el icono, la ventana se restaura con su estado visible y aparece en la pantalla.

Cambio del orden de visualización de las ventanas

AIR proporciona varios métodos para poder cambiar directamente el orden de visualización de las ventanas. Puede colocar una ventana delante del orden de visualización o detrás, mover una ventana encima de otra o detrás. Al mismo tiempo, el usuario puede reordenar las ventanas activándolas.

Puede mantener una ventana delante del resto si establece su propiedad alwaysInFront como true . Si hay más de una ventana con este ajuste, el orden de visualización de las ventanas se ajustará entre sí, pero siempre se visualizarán delante de ventanas que tengan la propiedad alwaysInFront como false.

Las ventanas del grupo superior también se visualizan sobre el resto de las aplicaciones, incluso si la aplicación de AIR no está activa. Como este comportamiento no es el habitual del resto de usuarios, solo se debe establecer alwaysInFront como true cuando sea realmente necesario. Entre los ejemplos de usos justificados se incluyen:

  • Ventanas emergentes temporales para controles como sugerencias, listas, menús personalizados o cuadros combinados. Como estas ventanas se cierran cuando dejan de recibir la selección, está justificado el comportamiento para evitar que el usuario no pueda ver las ventanas.

  • Mensajes de error y alertas realmente importantes. Si se produce un cambio irrevocable y el usuario no responde a tiempo, está justificado el comportamiento para poner la alerta en primer plano. Sin embargo, la mayoría de los errores y alertas se pueden gestionar con el orden de visualización normal de las ventanas.

  • Ventanas temporales superpuestas.

Nota: AIR no obliga a utilizar la propiedad alwaysInFront correctamente. Si embargo, si su aplicación no se ajusta al flujo normal del resto de usuarios, es muy probable que termine en la papelera de reciclaje.

Si una ventana contiene otras ventanas, estas siempre se ordenan frente a la misma. Si se llama a orderToFront() o se establece alwaysInFront en true en una ventana que incluya otra ventana, las ventanas incluidas se reordenan junto con la ventana propietaria frente a las demás ventanas, pero las ventanas incluidas aún se muestran frente a la propietaria.

La llamada a los métodos de ordenación de ventanas en las ventanas incluidas funciona normalmente entre las ventanas contenidas en la misma ventana, pero también se puede cambiar el orden de todo el grupo de ventanas incluidas en comparación con las ventanas fuera de ese grupo. Por ejemplo, si se llama a orderToFront() en una ventana incluida, tanto esa ventana como su propietaria y cualquier otra ventana incluida por la misma propietaria, se mueven a la parte frontal del orden de visualización de ventanas.

La clase NativeWindow proporciona las siguientes propiedades y métodos para establecer el orden de visualización de una ventana con respecto a otras:

Miembro

Descripción

Propiedad alwaysInFront

Especifica si la ventana se muestra en el grupo superior de ventanas.

En casi todos los casos, el mejor ajuste es false . Si cambia el valor de false a true , la ventana se coloca delante del resto (aunque no se activa). Si cambia el valor de true a false , la ventana se coloca detrás del resto de ventanas del grupo superior, aunque delante del resto de ventanas. Si no cambia la propiedad de la ventana, tampoco cambia su orden de visualización.

La configuración alwaysInFront no se aplica a las ventanas incluidas por otra ventana.

orderToFront()

Trae la ventana al frente.

orderInFrontOf()

Coloca la ventana directamente delante de una ventana concreta.

orderToBack()

Envía la ventana detrás del resto de ventanas.

orderBehind()

Envía la ventana directamente detrás de una ventana concreta.

activate()

Coloca la ventana en primer plano, la hace visible y le asigna la selección.

Nota: si una ventana está oculta ( visible es false ) o minimizada, llamar a los métodos de orden de visualización no produce ningún efecto.

En el sistema operativo Linux, los diferentes administradores de ventana aplican reglas distintas relacionadas con el orden de visualización de la ventana:

  • En algunos administradores, las ventanas de utilidades siempre se muestran delante de las ventanas normales.

  • En algunos administradores de ventanas, una ventana de pantalla completa con alwaysInFront establecido en true , siempre se muestra delante de otras ventanas que también tienen el valor alwaysInFront definido como true .

Cómo cerrar una ventana

Para cerrar una ventana, utilice el método NativeWindow.close() .

Al cerrar la ventana, se descarga su contenido, pero si otros objetos tienen referencias a él, este no se elimina. El método NativeWindow.close() se ejecuta de forma asíncrona y la aplicación contenida en la ventana se sigue ejecutando durante el proceso de cierre. El método close distribuye un evento close una vez finalizada la operación de cierre. El objeto NativeWindow sigue siendo técnicamente válido, aunque al intentar acceder a la mayoría de propiedades y métodos de una ventana cerrada, se genera un error IllegalOperationError. No es posible volver a abrir una ventana cerrada. Verifique la propiedad closed de una ventana para ver si se ha cerrado o no. Simplemente para ocultar la visibilidad de una ventana, establezca la propiedad NativeWindow.visible como false .

Si la propiedad Nativeapplication.autoExit es true (valor predeterminado), la aplicación se cerrará al cerrarse la última ventana.

Cualquier ventana que tenga una propietaria, se cierra cuando la propietaria se cierra. Las ventanas contenidas no distribuyen un evento de cierre y, por lo tanto, no pueden evitarlo. Se distribuye un evento close.

Permiso para cancelar operaciones con ventanas

Si una ventana utiliza fondo cromático del sistema, es posible cancelar la interacción con el usuario que esté detectando cancelar el comportamiento predeterminado de los eventos adecuados. Por ejemplo, cuando un usuario hace clic en el botón para cerrar el fondo cromático del sistema, se distribuye el evento closing . Si algún detector registrado llama al método preventDefault() del evento, la ventana no se cierra.

Si una ventana no utiliza fondo cromático, los eventos de notificación de cambios intencionados no se distribuyen automáticamente antes del cambio. Por ello, si llama a métodos para cerrar una ventana, para cambiar su estado o para definir las propiedades de su contorno, el cambio no se puede cancelar. Para avisar a los componentes de la aplicación antes de que se realice un cambio de ventana, la lógica de la aplicación puede distribuir el evento de notificación correspondiente mediante el método dispatchEvent() de la ventana.

Por ejemplo, la siguiente lógica implementa un controlador de eventos cancelable para un botón de cierre de una ventana:

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

El método dispatchEvent() devuelve false si un detector llama al método preventDefault() del evento. No obstante, también puede devolver false por otros motivos. Por ello, es mejor utilizar explícitamente el método isDefaultPrevented() para probar si se debe cancelar o no el cambio.

Maximización, minimización y restauración de una ventana

Para maximizar la ventana, utilice el método maximize() de NativeWindow.

myWindow.maximize(); 

Para minimizar la ventana, utilice el método minimize() de NativeWindow.

myWindow.minimize(); 

Para restaurar la ventana (es decir, hacer que recupere el tamaño que tenía antes de maximizarla o minimizarla), utilice el método restore() de NativeWindow.

myWindow.restore(); 

Una venta que tenga una propietaria se minimiza y se restaura cuando la ventana propietaria se minimice o se restaure. La ventana incluida no distribuye eventos cuando se minimiza, ya que su propietaria también se minimiza.

Nota: el comportamiento resultante de maximizar una ventana de AIR es distinto al comportamiento estándar de Mac OS X. En vez de alternar entre el tamaño “estándar” definido por la aplicación y el último tamaño establecido por el usuario, las ventanas de AIR alternan entre el último tamaño establecido por la aplicación y el tamaño completo utilizable de la pantalla.

En el sistema operativo Linux, los diferentes administradores de ventana aplican reglas distintas relacionadas con la configuración del estado de visualización de la ventana:

  • En algunos administradores, las ventanas de utilidades no se puede maximizar.

  • Si se define un tamaño máximo para la ventana, algunas ventanas no permiten que se maximice una ventana. Otros administradores de ventanas establecen el estado de visualización como maximizado, pero no cambian el tamaño de la ventana. En cualquier caso, no se distribuye ningún evento de cambio de estado de visualización.

  • Algunos administradores de ventanas no aceptan la configuración maximizable o minimizable de la ventana.

Nota: en Linux, las propiedades de la ventana se modifican de forma asincrónica. Si se cambia el estado de visualización en una línea del programa y se lee el valor en la siguiente, el valor leído aún reflejará la configuración anterior. En todas las plataformas, el objeto NativeWindow distribuye el evento displayStateChange cuando cambia el estado de visualización. Si se necesita realizar alguna operación en función del nuevo estado de la ventana, siempre se debe llevar a cabo en un controlador de eventos displayStateChange . Consulte Detección de eventos de ventanas .

Ejemplo: Minimizar, maximizar, restaurar y cerrar una ventana

La siguiente aplicación corta de MXML muestra los métodos maximize() , minimize() , restore() y close() de Window:

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

El siguiente ejemplo de ActionScript para Flash crea cuatro campos de texto en los que se puede hacer clic y que activan los métodos minimize() , maximize() , restore() y close() de 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(); 
        } 
    } 
}

Cambio de tamaño y desplazamiento de una ventana

Si una ventana utiliza fondo cromático del sistema, este proporciona controles de arrastre para cambiar el tamaño de la ventana y moverla por el escritorio. Si una ventana no utiliza fondo cromático del sistema, deberá añadir sus propios controles para que el usuario pueda cambiarla de tamaño o desplazarla.

Nota: para cambiar el tamaño de una ventana, primero debe obtener una referencia a la instancia de NativeWindow. Para obtener más información sobre cómo obtener una referencia a la ventana, consulte Obtención de una instancia de NativeWindow .

Cambio de tamaño de una ventana

Para que un usuario pueda cambiar el tamaño de una ventana de forma interactiva, utilice el método startResize() de NativeWindow. Si se llama a este método desde un evento mouseDown , la operación de cambio de tamaño corre a cargo del ratón y finaliza cuando el sistema operativo recibe un evento mouseUp . Cuando se llama a startResize() , se transfiere un argumento que especifica el borde y la esquina desde los que se puede cambiar el tamaño de la ventana.

Para establecer el tamaño de la ventana mediante programación, defina las propiedades de la ventana width , height o bounds con las dimensiones deseadas. Si se establecen los límites, la posición y el tamaño de la ventana se pueden modificar al mismo tiempo. Sin embargo, no se puede garantizar el orden en que suceden los cambios. Algunos administradores de ventanas de Linux no permiten que las ventanas se amplíen fuera de los límites de la pantalla del escritorio. En estos casos, el tamaño final de la ventana puede estar limitado debido al orden en que se establecen las propiedades, aunque con el resultado goblal de los cambios se podría haber obtenido una ventana válida. Por ejemplo, si se modifica la altura y la posición y de una ventana junto a la parte inferior de la pantalla, puede que no se produzca el cambio completo de altura cuando se aplique el cambio de altura antes del cambio de posición y.

Nota: en Linux, las propiedades de la ventana se modifican de forma asincrónica. Si cambia el tamaño de una ventana en una línea del programa y lee las dimensiones en la siguiente, aún se reflejará la configuración anterior. En todas las plataformas, el objeto NativeWindow distribuye el evento resize cuando se cambia el tamaño de la ventana. Si se necesita realizar alguna operación, como distribuir controles en la ventana, en función del nuevo tamaño o estado de la ventana, siempre se debe llevar a cabo en un controlador de eventos resize . Consulte Detección de eventos de ventanas .

El modo de escala del escenario determina cómo se comporta el escenario de la ventana y su contenido cuando se cambia la ventana de tamaño. No olvide que los modos de escala del escenario están diseñados para situaciones (como un navegador web) en las que la aplicación no controla el tamaño ni la relación de aspecto de la visualización. En general, los mejores resultados se obtienen estableciendo la propiedad scaleMode como StageScaleMode.NO_SCALE . Si quiere escalar también el contenido de la ventana, debe establecer los parámetros scaleX y scaleY del contenido como respuesta a los cambios de los límites de la ventana.

Desplazamiento de una ventana

Para desplazar una ventana sin cambiar su tamaño, utilice el método startMove() de NativeWindow. Al igual que el método startResize() , cuando se llama a startMove() desde un evento mouseDown , el proceso de desplazamiento corre a cargo del ratón y finaliza cuando el sistema operativo recibe un evento mouseUp .

Para obtener más información sobre los métodos startResize() y startMove() , consulte Referencia de ActionScript 3.0 para la plataforma de Adobe Flash .

Para mover una ventana mediante programación, establezca las propiedades x , y o bounds de la ventana en la posición deseada. Si se establecen los límites, la posición y el tamaño de la ventana se pueden modificar al mismo tiempo.

Nota: en Linux, las propiedades de la ventana se modifican de forma asincrónica. Si se mueve una ventana en una línea del programa y se lee la posición en la siguiente, el valor leído aún reflejará la configuración anterior. En todas las plataformas, el objeto NativeWindow distribuye el evento move cuando cambia la posición. Si se necesita realizar alguna operación en función de la nueva posición de la ventana, siempre se debe llevar a cabo en un controlador de eventos move . Consulte Detección de eventos de ventanas .

Ejemplo: Cambio de tamaño y desplazamiento de ventanas

El siguiente ejemplo muestra como iniciar el campo de tamaño y las operaciones de desplazamiento de una ventana:

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