2011-06-17 4 views
2

FlexのUIComponentを拡張するコンポーネントがありますが、FlexMouseEvent.MOUSE_DOWN_OUTSIDEリスナーを追加しますが、機能しません。つまり、私はイベントをキャプチャできません。しかし、PopUpManagerを使用してこのコンポーネントを追加し、FlexMouseEvent.MOUSE_DOWN_OUTSIDEリスナーを追加すると、正常に動作します。FlexMouseEvent.MOUSE_DOWN_OUTSIDEはポップアップコンポーネントに対してのみ機能しますか?

FlexMouseEvent.MOUSE_DOWN_OUTSIDEはポップアップコンポーネントに対してのみ機能しますか?

ありがとうございます

+1

これは、コンポーネントの外部でコンポーネントをクリックして閉じることができる機能です。 – xwgou

答えて

5

このイベントはポップアップでのみ発生します。マウスイベントをチェックする場合は、通常のマウスを親コンテナに追加し、ターゲットがでない場合はであるかどうかを確認する必要があります。

これを実行する別の方法は、ステージとコンポーネントでイベントをキャッチすることです。バブルが上に行くので、コンポーネントのクリックが最初に捕捉されます。

public var bCompClicked=false; 

stage.addEventListener(MouseEvent.CLICK,onStageClick); 
myComponent.addEventListener(MouseEvent.CLICK,onComponentClick); 

private function onComponentClick(event:MouseEvent):void{ 
    bCompClicked = true; 
} 

private function onStageClick(event:MouseEvent):void{ 
    if(!bCompClicked){ //we didn't click the component, so we clicked outside it.. 
     clickedOutSide(); 
    }else{ 
     bCompClicked=false; //we did click the component, set to false for the next time. 
    } 
} 

private function clickedOutSide():void{ 
    //do what you want when someone clicks outside... 
} 

免責事項私はこれをテストしたか、非常に難しいそれについて考えた...ので、それが動作しないことがありませんでした。

+1

これは良い解決策ですが、2つのイベントリスナーを使用する代わりに、ステージクリックハンドラで 'event.target == this 'が表示されているかどうかを確認できます。 –

+0

@J_A_Xコンポーネントが子コントロールによって合成されていると、これが複雑になる可能性があります。だから私は元のアプローチが良いと思う。 – splash

+0

@splashイベントリスナーがアタッチされているコンポーネントを返す 'event.currentTarget == this'を聞くことができます。これは、コンポーネントの子であっても呼び出されます。 –

0

これは、Jonathanの回答を1つのハンドラで処理し、子コンポーネントがある場合はそれを処理するフォローアップです。

stage.addEventListener(MouseEvent.CLICK,onStageClick, false, 0, true); 

private function onStageClick(event:MouseEvent):void 
{ 
    var object:Object = event.target; 
    while (object && object != this && object.hasOwnProperty("parent")) { 
    object = object.parent; 
    } 
    if (object != this) { 
    // the click is not from this component or its children 
    } 
} 
関連する問題