ウィンドウの管理

Adobe AIR 1.0 およびそれ以降

デスクトップウィンドウの外観、動作、ライフサイクルを管理するには、NativeWindow クラスのプロパティとメソッドを使用します。

注意: Flex フレームワークを使用する場合は、一般にフレームワーククラスを使用してウィンドウ動作を管理する方が適切です。NativeWindow のほとんどのプロパティおよびメソッドには、mx:WindowedApplication および mx:Window クラスを使用してアクセスできます。

NativeWindow インスタンスの取得

ウィンドウを操作するには、最初にウィンドウインスタンスを取得する必要があります。ウィンドウインスタンスは、次のいずれかの場所から取得できます。

  • ウィンドウの作成に使用されるネイティブウィンドウコンストラクター:

    var win:NativeWindow = new NativeWindow(initOptions);
  • ウィンドウステージの nativeWindow プロパティ:

    var win:NativeWindow = stage.nativeWindow;
  • ウィンドウ内の表示オブジェクトの stage プロパティ:

    var win:NativeWindow = displayObject.stage.nativeWindow;
  • ウィンドウによって送出されるネイティブウィンドウイベントの target プロパティ:

    private function onNativeWindowEvent(event:NativeWindowBoundsEvent):void 
    { 
        var win:NativeWindow = event.target as NativeWindow; 
    }
  • ウィンドウに表示される HTML ページの nativeWindow プロパティ:

    var win:NativeWindow = htmlLoader.window.nativeWindow;
  • NativeApplication オブジェクトの activeWindow プロパティと openedWindows プロパティ:

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

    NativeApplication.nativeApplication.activeWindow は、アプリケーションのアクティブなウィンドウを示しています(ただし、アクティブなウィンドウが AIR アプリケーションのウィンドウでない場合は、 null を返します)。 NativeApplication.nativeApplication.openedWindows 配列には、AIR アプリケーション内で閉じられていないすべてのウィンドウが格納されています。

Flex の mx:WindowedApplication オブジェクトと mx:Window オブジェクトは表示オブジェクトなので、次に示すように、 stage プロパティを使用して、MXML ファイル内のアプリケーションウィンドウを簡単に参照できます。

<?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
注意: WindowedApplication コンポーネントまたは Window コンポーネントが Flex フレームワークによってウィンドウステージに追加されるまで、コンポーネントの stage プロパティは null です。この動作は、Flex Application コンポーネントの動作と同じですが、 creationComplete などの WindowedApplication および Window コンポーネントの初期化サイクルの早い段階で発生するイベントに対するリスナーでは、ステージまたは NativeWindow インスタンスにアクセスできないことを意味します。 applicationComplete イベントが送出された時点では、ステージおよび NativeWindow インスタンスにアクセスしても安全です。

ウィンドウのアクティブ化、表示、非表示

ウィンドウをアクティブ化するには、NativeWindow の activate() メソッドを呼び出します。ウィンドウをアクティブ化すると、ウィンドウが前面になり、キーボードとマウスのフォーカスが設定され、必要な場合は、ウィンドウを復元するか、または visible プロパティを true に設定することでウィンドウが表示されるようになります。あるウィンドウをアクティブ化しても、アプリケーション内での他のウィンドウの順序は変わりません。 activate() メソッドを呼び出すと、ウィンドウは activate イベントを送出します。

非表示になっているウィンドウをアクティブ化しないで表示するには、 visible プロパティを true に設定します。これによりウィンドウは前面になりますが、フォーカスがウィンドウに割り当てられることはありません。

ウィンドウを非表示にするには、 visible プロパティを false に設定します。ウィンドウを非表示にすると、ウィンドウ、関連するタスクバーアイコン、および MacOS X ではウィンドウメニューのエントリが表示されなくなります。

ウィンドウの可視性を変更すると、このウィンドウが所有するすべてのウィンドウの可視性も同様に変更されます。例えば、ウィンドウを非表示にすると、そのウィンドウが所有しているウィンドウもすべて非表示になります。

注意: Mac OS X では、ドックのウィンドウ部分にアイコンがある最小化されたウィンドウを完全に非表示にすることはできません。最小化されたウィンドウの visible プロパティを false に設定しても、そのウィンドウのドックアイコンは表示されています。ユーザーがアイコンをクリックすると、ウィンドウは復元されて表示されるようになります。

ウィンドウの表示順序の変更

AIR では、ウィンドウの表示順序を複数の方法で直接変更できます。ウィンドウの表示順序の前面は背面に移動したり、ウィンドウを別のウィンドウの前や後に移動したりできます。同時に、ウィンドウをアクティブ化することでウィンドウの順序を変更することもできます。

alwaysInFront プロパティを true に設定することで、あるウィンドウを他のウィンドウより前面に保つことができます。このように設定されたウィンドウが複数ある場合、同じ設定のウィンドウ間で表示順序が並べ替えられます。ただし、それらのウィンドウは、 alwaysInFront が false に設定されたウィンドウよりは常に前面に配置されます。

また、最上位グループのウィンドウは、AIR アプリケーションがアクティブではない場合でも、他のアプリケーションのウィンドウより前面に表示されます。この動作はユーザーにとっては迷惑である場合があるので、 alwaysInFront true に設定するのは、それが必要であって適切である場合にのみ行う必要があります。例えば、次のような場合には使用が正当化されます。

  • ツールチップ、ポップアップリスト、カスタムメニュー、コンボボックスなどのコントロール用の一時的なポップアップウィンドウ。これらのウィンドウはフォーカスを失ったときに閉じる必要があるので、別のウィンドウの表示の邪魔になるのを避けることができます。

  • 特に緊急を要するエラーメッセージと警告。ユーザーが直ちに応答しないと元に戻すことのできない変更が発生する可能性がある場合は、警告ウィンドウを最前面に移動してもかまいません。ただし、ほとんどのエラーと警告は、通常のウィンドウ表示順序で処理できます。

  • 短時間だけ表示されるトーストスタイルのウィンドウ。

注意: AIR では、 alwaysInFront プロパティの適切な使用は強制されません。ただし、ユーザーのワークフローを妨害するようなアプリケーションは、ごみ箱行きになることでしょう。

ウィンドウが他のウィンドウを所有している場合、所有下にあるウィンドウは常に所有者のウィンドウより前に配置されるように並べ替えられます。他のウィンドウを所有するウィンドウで orderToFront() を呼び出したり、 alwaysInFront true に設定した場合、所有下にあるウィンドウも所有者ウィンドウと一緒に並べ替えられ、他のウィンドウの前面に配置されます。ただし、所有下にあるウィンドウは、所有者ウィンドウの前面に引き続き表示されます。

所有下にあるウィンドウからウィンドウの並べ替えメソッドを呼び出した場合、所有者ウィンドウが同じであるウィンドウ間では通常通り動作します。ただし、所有下にあるウィンドウのグループ全体が、そのグループ以外のウィンドウと比較され、並べ替えられることがあります。例えば、所有下にあるウィンドウから orderToFront() を呼び出すと、そのウィンドウ自身、その所有者、所有者が同じであるその他すべてのウィンドウが、ウィンドウ表示順序の前面に移動します。

NativeWindow クラスには、ウィンドウ間の相対的な表示順序を設定する次のプロパティとメソッドが用意されています。

メンバー

説明

alwaysInFront プロパティ

ウィンドウを最上位ウィンドウグループに表示するかどうかを指定します。

通常は、 false が最善の設定です。値を false から true に変更すると、そのウィンドウは他のウィンドウの前面に移動します(ただし、アクティブにはなりません)。値を true から false に変更すると、そのウィンドウは最上位グループに残っているウィンドウの背後に移動しますが、他のウィンドウよりは前面になっています。プロパティをウィンドウの現在値と同じ値に設定すると、ウィンドウの表示順序は変わりません。

alwaysInFront 設定は、他のウィンドウに所有されているウィンドウに対しては効果はありません。

orderToFront()

ウィンドウを前面に移動します。

orderInFrontOf()

ウィンドウを特定のウィンドウのすぐ前面に表示します。

orderToBack()

ウィンドウを他のウィンドウの背後に移動します。

orderBehind()

ウィンドウを特定のウィンドウのすぐ背後に表示します。

activate()

ウィンドウを前面に移動します(同時に、ウィンドウを表示状態にしてフォーカスを割り当てます)。

注意: ウィンドウが非表示状態( visible false )または最小化状態の場合は、表示順序メソッドを呼び出しても順序は変更されません。

Linux オペレーティングシステムでは、別のウィンドウマネージャーにより、ウィンドウの表示順序に関する別の規則が適用されます。

  • 一部のウィンドウマネージャーでは、normal ウィンドウの前面にユーティリティウィンドウが常に表示されます。

  • 一部のウィンドウマネージャーでは、 alwaysInFront true に設定されているフルスクリーンウィンドウが、 alwaysInFront true に設定されている他のウィンドウの前面に常に表示されます。

ウィンドウを閉じる

ウィンドウを閉じるには、 NativeWindow.close() メソッドを使用します。

ウィンドウを閉じると、ウィンドウのコンテンツの読み込みは解除されますが、他のオブジェクトがそのコンテンツを参照している場合は、コンテンツオブジェクトは破棄されません。 NativeWindow.close() メソッドは非同期に実行するので、ウィンドウに含まれるアプリケーションは、閉じる処理が行われている間も実行を続けます。閉じる操作が完了すると、close メソッドは close イベントを送出します。NativeWindow オブジェクトは技術的にはまだ有効な状態ですが、閉じられたウィンドウのほとんどのプロパティとメソッドは、アクセスすると IllegalOperationError が生成されます。閉じられたウィンドウを再び開くことはできません。ウィンドウが閉じられているかどうかを確認するには、ウィンドウの closed プロパティを調べます。単にウィンドウを非表示にするには、 NativeWindow.visible プロパティを false に設定します。

Nativeapplication.autoExit プロパティが true の場合は(デフォルト)、最後のウィンドウが閉じるとアプリケーションは終了します。

所有下にあるウィンドウは、所有者が閉じられたときに一緒に閉じます。所有下にあるウィンドウからは closing イベントが送出されないため、閉じる処理を取り消すことはできません。close イベントは送出されます。

ウィンドウ操作のキャンセルの許可

ウィンドウがシステムクロムを使用している場合は、適切なイベントをリッスンし、イベントのデフォルト動作をキャンセルすることで、ユーザーによるウィンドウの操作をキャンセルできます。例えば、ユーザーがシステムクロムの閉じるボタンをクリックすると、 closing イベントが送出されます。登録されているリスナーがイベントの preventDefault() メソッドを呼び出すと、ウィンドウは閉じません。

ウィンドウがシステムクロムを使用していない場合は、目的の変更が行われる前に変更の通知イベントが自動的に送出されることはありません。したがって、ウィンドウを閉じたり、ウィンドウの状態を変更したり、ウィンドウ境界プロパティを設定したりするメソッドを呼び出した場合、変更はキャンセルできません。ウィンドウの変更が行われる前にアプリケーションのコンポーネントに通知するには、アプリケーションのロジックで、ウィンドウの dispatchEvent() メソッドを使用して、関連する通知イベントを送出します。

例えば、次のロジックは、ウィンドウの閉じるボタンに対するキャンセル可能なイベントハンドラーを実装しています。

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

イベントの preventDefault() メソッドがリスナーによって呼び出されると、 dispatchEvent() メソッドは false を返します。ただし、このメソッドは他の理由でも false を返す場合があるので、 isDefaultPrevented() メソッドを明示的に使用して、変更をキャンセルする必要があるかどうかを判定するのがよい方法です。

ウィンドウの最大化、最小化、復元

ウィンドウを最大化するには、NativeWindow の maximize() メソッドを使用します。

myWindow.maximize(); 

ウィンドウを最小化するには、NativeWindow の minimize() メソッドを使用します。

myWindow.minimize(); 

ウィンドウを復元するには(つまり、最大化または最小化されていたウィンドウを元のサイズに戻すには)、NativeWindow の restore() メソッドを使用します。

myWindow.restore(); 

所有下にあるウィンドウは、所有者ウィンドウが最小化または復元されたときに、一緒に最小化または復元されます。所有者の最小化に伴い最小化される際には、所有下にあるウィンドウからはイベントは送出されません。

注意: AIR ウィンドウを最大化したときの動作は、Mac OS X での標準の動作とは異なります。アプリケーションで定義されている「標準」サイズとユーザーが最後に設定したサイズの間で切り替えが行われるのではなく、AIR ウィンドウは、アプリケーションまたはユーザーが最後に設定したサイズと、画面で使用可能な領域全体との間で切り替わります。

Linux オペレーティングシステムでは、別のウィンドウマネージャーにより、ウィンドウの表示状態の設定に関する別の規則が適用されます。

  • 一部のウィンドウマネージャーでは、ユーティリティウィンドウを最大化できません。

  • ウィンドウに最大サイズが設定されている場合、一部のウィンドウではウィンドウを最大化できません。他のウィンドウマネージャーでは、表示状態が最大化に設定されますが、ウィンドウのサイズは変更されません。いずれの場合も、表示状態変更イベントは送出されません。

  • 一部のウィンドウマネージャーは、ウィンドウの maximizable 設定または minimizable 設定を受け取りません。

注意: Linux では、ウィンドウプロパティは非同期で変更されます。プログラムのある行で表示状態を変更し、次の行で値を読み取る場合、読み取られた値には古い値が反映されます。すべてのプラットフォームで、表示状態が変更されると、NativeWindow オブジェクトから displayStateChange イベントが送出されます。ウィンドウの新しい状態に基づいて何らかのアクションを実行する必要がある場合、常に displayStateChange イベントハンドラーで行ってください。 ウィンドウイベントのリッスン を参照してください。

例:ウィンドウの最小化、最大化、復元、終了

次の短い MXML アプリケーションでは、Window の maximize() minimize() restore() および 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>

次に示す Flash 用の ActionScript の例では、NativeWindow の minimize() maximize() restore() および close() メソッドをトリガーする 4 つのクリック可能なテキストフィールドを作成しています。

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

ウィンドウのサイズ変更と移動

ウィンドウがシステムクロムを使用している場合は、クロムがウィンドウのサイズ変更とデスクトップ上での移動に対するドラッグを制御します。システムクロムを使用しない場合は、独自のコントロールを追加して、ユーザーがウィンドウのサイズ変更および移動を行うことができるようにする必要があります。

注意: ウィンドウのサイズ変更または移動を行うには、最初に、NativeWindow インスタンスに対する参照を取得する必要があります。ウィンドウの参照を取得する方法について詳しくは、 NativeWindow インスタンスの取得 を参照してください。

ウィンドウのサイズ変更

ユーザーがインタラクティブにウィンドウのサイズを変更できるようにするには、NativeWindow の startResize() メソッドを使用します。 mouseDown イベントからこのメソッドを呼び出すと、マウスの動作に応じてサイズ変更操作が行われ、オペレーティングシステムが mouseUp イベントを受信すると完了します。 startResize() を呼び出すときは、ウィンドウのサイズ変更の基準になる辺または角を指定する引数を渡します。

ウィンドウサイズをプログラムによって設定するには、ウィンドウの width height または bounds の各プロパティを目的のサイズに設定します。境界を設定すると、ウィンドウのサイズと位置をすべて同時に変更できます。ただし、変更が行われる順序は保証されません。一部の Linux ウィンドウマネージャーでは、デスクトップ画面の境界の外側にウィンドウを拡張することはできません。このような場合、プロパティの設定順序により、通常は変更の純粋な影響により正式なウィンドウが作成される場合でも、最終的なウィンドウのサイズが制限される可能性があります。例えば、画面の下部付近でウィンドウの高さと y 位置の両方を変更する場合、y 位置の変更の前に高さの変更が適用されると、高さが完全に変更されない可能性があります。

注意: Linux では、ウィンドウプロパティは非同期で変更されます。プログラムのある行でウィンドウのサイズを変更し、次の行でサイズを読み取る場合、読み取られた値には古い値が反映されます。すべてのプラットフォームで、ウィンドウのサイズが変更されると、NativeWindow オブジェクトから resize イベントが送出されます。ウィンドウの新しいサイズまたは状態に基づいて何らかのアクション(ウィンドウ内のコントロールのレイアウトなど)を実行する必要がある場合、常に resize イベントハンドラーで行ってください。 ウィンドウイベントのリッスン を参照してください。

ステージのスケールモードにより、ウィンドウのサイズが変更されるときのウィンドウステージとそのコンテンツの動作が決まります。ステージのスケールモードは、アプリケーションが表示領域のサイズや縦横比を制御しない Web ブラウザーのような状況を対象に設計されていることに注意してください。一般に、ステージの scaleMode プロパティを StageScaleMode.NO_SCALE に設定すると、最善の結果が得られます。ウィンドウのコンテンツを拡大/縮小する必要がある場合は、ウィンドウの境界の変更に呼応してコンテンツの scaleX および scaleY パラメーターを設定してもかまいません。

ウィンドウの移動

サイズを変更しないでウィンドウを移動するには、NativeWindow startMove() メソッドを使用します。 startResize() メソッドと同様に、 mouseDown イベントから startMove() メソッドを呼び出すと、マウスの操作に応じて移動処理が行われ、オペレーティングシステムが mouseUp イベントを受信すると完了します。

startResize() メソッドおよび startMove() メソッドについて詳しくは、『 Adobe Flash Platform 用 ActionScript 3.0 リファレンスガイド 』を参照してください。

ウィンドウをプログラムによって移動するには、ウィンドウの x y または bounds の各プロパティを目的の位置に設定します。境界を設定すると、ウィンドウのサイズと位置を両方同時に変更できます。

注意: Linux では、ウィンドウプロパティは非同期で変更されます。プログラムのある行でウィンドウを移動し、次の行で位置を読み取る場合、読み取られた値には古い値が反映されます。すべてのプラットフォームで、位置が変更されると、NativeWindow オブジェクトから move イベントが送出されます。ウィンドウの新しい位置に基づいて何らかのアクションを実行する必要がある場合、常に move イベントハンドラーで行ってください。 ウィンドウイベントのリッスン を参照してください。

例:ウィンドウのサイズ変更と移動

次の例では、ウィンドウでのサイズ変更および移動操作を開始する方法を示します。

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