Gerenciamento de janelas

Adobe AIR 1.0 e posterior

Use as propriedades e os métodos da classe NativeWindow para gerenciar a aparência, o comportamento e o ciclo de vida das janelas de área de trabalho.

Nota: Ao usar a estrutura do Flex, em geral é melhor gerenciar o comportamento da janela usando as classes da estrutura. A maioria das propriedades e métodos NativeWindow podem ser acessados através das classes mx:WindowedApplication e mx:Window classes.

Obtenção de uma ocorrência de NativeWindow

Para manipular uma janela, primeiro você deve obter a ocorrência dela. A ocorrência da janela pode ser obtida em um dos seguintes lugares:

  • O construtor nativo de janela usado para criar a janela:

    var win:NativeWindow = new NativeWindow(initOptions);
  • A propriedade nativeWindow do estágio da janela:

    var win:NativeWindow = stage.nativeWindow;
  • A propriedade stage de um objeto de exibição na janela:

    var win:NativeWindow = displayObject.stage.nativeWindow;
  • A propriedade target de um evento de janela nativa despachada pela janela:

    private function onNativeWindowEvent(event:NativeWindowBoundsEvent):void 
    { 
        var win:NativeWindow = event.target as NativeWindow; 
    }
  • A propriedade nativeWindow de uma página HTML exibida na janela:

    var win:NativeWindow = htmlLoader.window.nativeWindow;
  • As propriedades activeWindow e openedWindows do objeto NativeApplication:

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

    NativeApplication.nativeApplication.activeWindow faz referência à janela ativa de um aplicativo (mas retorna null se a janela ativa não é uma janela deste aplicativo do AIR). A matriz NativeApplication.nativeApplication.openedWindows contém todas as janelas de um aplicativo do AIR que não foram fechadas.

Como os objetos mx:WindowedApplication e Window do Flex são objetos de exibição, você pode fazer referência facilmente à janela do aplicativo em um arquivo MXML usando a propriedade stage , da seguinte maneira:

<?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: Até o componente WindowedApplication ou Window ser adicionado ao palco da janela pela estrutura do Flex, a propriedade stage do componente é null . Este comportamento é consistente com o do componente Application do Flex, mas significa que não é possível acessar o palco ou a ocorrência de NativeWindow em ouvintes de eventos que ocorrem anteriormente no ciclo de inicialização dos componentes WindowedApplication e Window, como creationComplete . É seguro acessar o palco e a ocorrência de NativeWindow quando o evento applicationComplete é despachado.

Ativar, mostrar e ocultar janelas

Para ativar uma janela, chame o método activate() de NativeWindow. A ativação de uma janela a traz para frente, dá a ela foco do teclado e do mouse e, se necessário, a torna visível mediante a restauração da janela ou a definição da propriedade visible como true . A ativação de uma janela não altera a ordem de outras janelas do aplicativo. A chamada do método activate() faz com que a janela despache um evento activate .

Para mostrar uma janela oculta sem ativá-la, defina a propriedade visible como true . Isso traz a janela para frente, mas não atribui o foco para ela.

Para ocultar uma janela de forma que não seja exibida, defina sua propriedade visible como false . Ocultar uma janela suprime a exibição tanto da janela quanto de qualquer ícone relacionado na barra de tarefas e, no Mac OS X, a entrada no menu Janelas.

Quando você altera a visibilidade de uma janela, a visibilidade de quaisquer janelas de propriedade dessa janela também é alterada. Por exemplo, se você ocultar uma janela, todas as janelas de sua propriedade também ficarão ocultas.

Nota: No Mac OS X, não é possível ocultar totalmente uma janela minimizada que tenha um ícone na parte de janela do encaixe. Se a propriedade visible está definida como false em uma janela minimizada, o ícone de encaixe da janela continua sendo exibido. Se o usuário clica no ícone, a janela é restaurada para um estado visível e exibida.

Alteração da ordem de exibição de janelas

O AIR oferece diversos métodos para alterar diretamente a ordem de exibição das janelas. É possível mover uma janela para o começo ou o final da ordem de exibição, bem como colocar uma janela em cima de outra ou atrás dela. Ao mesmo tempo, o usuário pode reordenar as janelas ativando-as.

Você pode manter uma janela em frente de outras definindo sua propriedade alwaysInFront como true . Se mais de uma janela tiver essa configuração, a ordem de exibição dessas janelas será definida entre elas, mas sempre serão organizadas acima das janelas cuja propriedade alwaysInFront esteja definida como false.

As janelas que estão no primeiro grupo também são exibidas acima das janelas de outros aplicativos, mesmo quando o aplicativo do AIR não está ativo. Como esse comportamento pode interromper o trabalho do usuário, definir alwaysInFront como true é algo que só deve ser feito quando necessário e apropriado. Os exemplos de usos justificados incluem:

  • Janelas pop-up temporárias de controles, como dicas de ferramentas, listas pop-up, menus personalizados e caixas de combinação. Como essas janelas devem ser fechadas quando perdem o foco, pode-se evitar a dor de cabeça de impedir um usuário de ver outra janela.

  • Mensagens de erro e alertas extremamente urgentes. Quando pode ocorrer uma alteração irrevogável se o usuário não responde de imediato, pode ser justificável trazer uma janela de alerta para frente. No entanto, a maioria dos erros e alertas pode ser tratada na ordem de exibição normal das janelas.

  • Janelas pop-up de curta duração.

Nota: O AIR não impõe o uso apropriado da propriedade alwaysInFront . Entretanto, se o seu aplicativo interrompe o fluxo de trabalho de um usuário, possivelmente será enviado para a lixeira desse mesmo usuário.

Se uma janela for proprietária de outras, essas outras são sempre ordenadas à sua frente. Se você chamar orderToFront() ou definir alwaysInFront como true em uma janela que seja proprietária de outras, as janelas subordinadas são reordenadas com a janela proprietária em frente às outras janelas, mas as janelas subordinadas ainda são exibidas na frente da proprietária.

Chamar os métodos de ordenação de janelas em janelas subordinadas funciona normalmente entre janelas de propriedade da mesma janela, mas também pode alterar a ordem de todo o grupo de janelas subordinadas em relação a janelas fora desse grupo. Por exemplo, se você chamar orderToFront() em uma janela subordinada, essa janela, sua proprietária e quaisquer outras janelas subordinadas à mesma proprietária são movidos para a frente da ordem de exibição de janelas.

A classe NativeWindow oferece estas propriedades e métodos para definir a ordem de exibição de uma janela em relação a outras janelas:

Membro

Descrição

propriedade alwaysInFront

Especifica se a janela é exibida no primeiro grupo de janelas.

Em quase todos os casos, false é a melhor configuração. Alterar o valor de false para true traz a janela para frente de todas as janelas (mas não a ativa). Alterar o valor de true para false coloca a janela atrás das demais janelas do primeiro grupo, mas ainda na frente de outras. Definir a propriedade de uma janela com seu valor atual não altera a ordem de exibição.

A configuração alwaysInFront não tem nenhum efeito nas janelas de propriedade de outra janela.

orderToFront()

Traz a janela para frente.

orderInFrontOf()

Coloca a janela diretamente à frente de uma determinada janela.

orderToBack()

Envia a janela para trás de outras janelas.

orderBehind()

Coloca a janela diretamente atrás de uma determinada janela.

activate()

Traz a janela para frente (além de torná-la visível e de lhe atribuir foco).

Nota: Se uma janela está oculta ( visible é false ) ou minimizada, chamar os métodos de ordem de exibição não surte nenhum efeito.

No sistema operacional Linux, diferentes gerenciadores de janela forçam regras diferentes, dependendo da ordem de exibição da janela:

  • Em alguns gerenciadores de janela, as janelas do utilitário são sempre exibidas em frente às janelas normais.

  • Em alguns gerenciadores de janela, uma janela de tela cheia com alwaysInFront definida como true é sempre exibida na frente de outras janelas que também tenham alwaysInFront definida como true .

Fechamento de janelas

Para fechar uma janela, use o método NativeWindow.close() .

Fechar uma janela descarrega o conteúdo dela; porém, se outros objeto tiverem referências a esse conteúdo, os objetos de conteúdo não serão destruídos. O método NativeWindow.close() é executado de forma assíncrona, e o aplicativo que está contido na janela continua a executar durante o processo de fechamento. O método close despacha um evento close quando a operação de fechamento é concluída. O objeto NativeWindow ainda é tecnicamente válido, mas o acesso à maioria das propriedades e dos métodos em uma janela fechada gera IllegalOperationError. Não é possível reabrir uma janela fechada. Verifique a propriedade closed de uma janela para testar se a janela foi fechada. Para simplesmente ocultar a exibição de uma janela, defina a propriedade NativeWindow.visible como false .

Se a propriedade Nativeapplication.autoExit é true , o padrão, o aplicativo é encerrado ao ser fechada sua última janela.

Quaisquer janelas que tenham uma proprietária são fechadas quando a proprietária é fechada. As janelas que são propriedade de outra não despacham um evento closing e, portanto, não podem impedir seu fechamento. Um evento close é despachado.

Permissão do cancelamento de operações de janela

Quando uma janela usa o cromo do sistema, a interação do usuário com ela pode ser cancelada monitorando ou cancelando o comportamento padrão dos eventos apropriados. Por exemplo, quando um usuário clica no botão Fechar do cromo do sistema, o evento closing é despachado. Se algum ouvinte registrado chamar o método preventDefault() do evento, a janela não será fechada.

Quando uma janela não usa o cromo do sistema, os eventos de notificação referentes às alterações pretendidas não são despachados automaticamente antes de a alteração ser feita. Por isso, se você chamar os métodos para fechar uma janela ou se alterar o estado dela ou definir qualquer uma das propriedades de limites de janela, a alteração não poderá ser cancelada. Para notificar os componentes do seu aplicativo antes que seja feita uma alteração de janela, a lógica do aplicativo poderá despachar o evento de notificação relevante usando o método dispatchEvent() da janela.

Por exemplo, a seguinte lógica implementa um manipulador de eventos cancelável para o botão Fechar de uma janela:

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

O método dispatchEvent() retorna false se o método preventDefault() do evento é chamado por um ouvinte. No entanto, ele também pode retornar false por outros motivos, portanto é melhor usar o método isDefaultPrevented() explicitamente para testar se a alteração deve ser cancelada.

Maximização, minimização e restauração de uma janela

Para maximizar a janela, use o método maximize() da classe NativeWindow.

myWindow.maximize(); 

Para minimizar a janela, use o método minimize() de NativeWindow.

myWindow.minimize(); 

Para restaurar a janela (isto é, colocá-la novamente no tamanho em que estava antes de ser minimizada ou maximizada), use o método restore() de NativeWindow.

myWindow.restore(); 

Uma janela que tenha uma proprietária é minimizada e restaurada quando a janela proprietária é minimizada ou restaurada. Nenhum evento é despachado pela janela subordinada quando é minimizada porque sua proprietária está minimizada.

Nota: O comportamento resultante da maximização de uma janela do AIR é diferente do comportamento padrão do Mac OS X. Em vez de alternar entre um tamanho “padrão” definido pelo aplicativo e o último tamanho definido pelo usuário, as janelas do AIR alternam entre o último tamanho definido pelo aplicativo ou pelo usuário e a área útil total da tela.

No sistema operacional Linux, diferentes gerenciadores de janela forçam regras diferentes com relação a configuração do estado de exibição da janela:

  • Em alguns gerenciadores de janela, não é possível maximizar as janelas dos utilitários.

  • Se um tamanho máximo for definido para a janela, algumas janelas não permitirão a maximização. Alguns outros gerenciadores de janela definem o estado de exibição como maximizado, mas não redimensionam a janela. Em qualquer um dos casos, não é despachado nenhum evento de alteração do estado de exibição.

  • Alguns gerenciadores de janela não cumprem as configurações maximizable ou minimizable de janela.

Nota: No Linux, as propriedades da janela são alteradas de forma assíncrona. Se você alterar o estado de exibição em uma linha do programa e ler os valores na linha seguinte, o valor lido ainda refletirá a configuração antiga. Em todas as plataformas, o objeto NativeWindow despacha o evento displayStateChange quando o estado de exibição muda. Se você precisar realizar algumas ações com base no novo estado da janela, sempre faça isso em um manipulador de eventos displayStateChange . Consulte Monitorando eventos de janela .

Exemplo: minimização, maximização, restauração e fechamento de uma janela

O seguinte aplicativo MXML demonstra os métodos maximize() , minimize() , restore() e close() de janela:

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

O seguinte exemplo do ActionScript para Flash cria quatro campos de texto clicáveis que acionam os métodos minimize() , maximize() , restore() e 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(); 
        } 
    } 
}

Redimensionamento e movimentação de uma janela

Quando uma janela usa o cromo do sistema, o cromo oferece controles de arrastar que permitem redimensionar a janela e movimentá-la na área de trabalho. Se uma janela não usa o cromo do sistema, adicione seus próprios controles para que o usuário possa redimensionar e movimentar a janela.

Nota: Para redimensionar ou movimentar uma janela, primeiro você deve obter uma referência à ocorrência de NativeWindow. Para mais informações sobre como obter uma referência à janela, consulte Obtenção de uma ocorrência de NativeWindow .

Redimensionamento de uma janela

Para permitir que um usuário redimensione uma janela de forma interativa, use o método NativeWindow startResize() . Quando esse método é chamado a partir de um evento mouseDown , a operação de redimensionamento é orientada pelo mouse e executada quando o sistema operacional recebe um evento mouseUp . Quando chama startResize() , você passa um argumento que especifica a borda ou o canto a partir do qual a janela deve ser redimensionada.

Para definir o tamanho das janelas de forma programática, defina as propriedades width , height ou bounds da janela nas dimensões desejadas. Quando você define os limites, o tamanho da janela e a posição podem ser alterados ao mesmo tempo., No entanto, não há garantias da ordem de exibição das alterações. Alguns gerenciadores de janela do Linux não permitem que janelas se estendam além dos limites da tela da área de trabalho. Nesses casos, o tamanho final da janela pode ser limitado devido à ordem em que as propriedades são definidas, apesar de as alterações resultarem em uma janela legal. Por exemplo, se você alterar a altura e a posição y de uma janela perto da parte inferior da tela, a alteração na altura total pode não ocorrer quando for aplicada antes da alteração na posição y.

Nota: No Linux, as propriedades da janela são alteradas de forma assíncrona. Se você redimensionar uma janela em uma linha do seu programa, e ler as dimensões na próxima, elas ainda vão refletir as configurações antigas. Em todas as plataformas, o objeto NativeWindow despacha o evento resize quando a janela é redimensionada. Se precisar realizar alguma ação, como dispor controles na janela, com base no novo tamanho ou estado da janela, sempre faça isso em um manipulador de eventos resize . Consulte Monitorando eventos de janela .

O modo de dimensionamento do palco determina o comportamento do palco da janela e de seu conteúdo quando uma janela é redimensionada. Lembre-se de que os modos de dimensionamento de palco devem ser usados em situações em que o aplicativo não tem controle sobre o tamanho ou a proporção de seu espaço de exibição, como é o caso de um navegador da Web. Em geral, os melhores resultados são obtidos quando você define a propriedade scaleMode do palco como StageScaleMode.NO_SCALE . Para que o conteúdo da janela seja dimensionado, também é possível definir os parâmetros do conteúdo scaleX e scaleY em resposta às alterações nos limites da janela.

Movimentação de uma janela

Para mover uma janela sem redimensioná-la, utilize o método NativeWindow startMove() . Como acontece com o método startResize() , quando você chama o método startMove() a partir de um evento mouseDown , o processo de movimentação é orientado pelo mouse e executado quando o sistema operacional recebe um evento mouseUp .

Para obter mais informações, sobre os métodos startResize() e startMove() , consulte a Referência do ActionScript® 3.0 para Adobe® Flash® Platform .

Para mover uma janela em termos programáticos, defina as propriedades x , y ou bounds da janela até a posição desejada. Quando você define os limites, o tamanho da janela e a posição podem ser alterados ao mesmo tempo.

Nota: No Linux, as propriedades da janela são alteradas de forma assíncrona. Se você mover uma janela em uma linha do programa e ler a posição na linha seguinte, o valor lido ainda refletirá a configuração antiga. Em todas as plataformas, o objeto NativeWindow despacha o evento move quando a posição muda. Se você precisar realizar algumas ações com base na nova posição da janela, sempre faça isso em um manipulador de eventos move . Consulte Monitorando eventos de janela .

Exemplo: redimensionamento e movimentação de janelas

O exemplo abaixo mostra como iniciar operações de redimensionamento e movimentação em uma janela:

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