0

この問題は開発を停止し、何が問題なのかわかりません。flex がこれら 2 つの無関係なイベントをどのように結び付けているのかはよくわかりません。Some1 スプライトは、MouseEvent の伝播を停止している間に、MouseEvent.MOUSE_UP で Some1Event.MOUSE_UP イベントをディスパッチします。Some1 の親である Some2 も同様に Some2Event.MOUSE_UP をディスパッチし、Some2 で MouseEvent.MOUSE_UP を停止します。強制エラーは Some2Event と Some1Event の間にあります。このエラーで、他の #1034 ソリューションを試しました。

  1. メイン アプリケーションに Some1Event と Some2Event のインスタンス化を追加します。
  2. 「新しいイベント」でラッピング - カスタム プロパティがあるため、イベントをイベント タイプとしてディスパッチできません。

次のコードも試しました。

    import flash.utils.getQualifiedClassName;
    private var systemManager:SystemManager=new SystemManager;

    private function addEventTracer():void
    {
        systemManager.addEventListener(Some1Event.MOUSE_UP, eventTracer, true);
    }

    private function eventTracer(event:Event):void
    {
        trace("Got ", event.type, "from", event.target, "as",
            getQualifiedClassName(event));
    }

しかし、それは何も報告しませんでした。

イベント Some2Event のディスパッチ中に、エラーが発生しました

TypeError: Error #1034: Type Coercion failed: cannot convert  ::Some2Event@117c6c831 to Some1Event.
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at ::Some2/mouseUpHandler()[Some2.as:154]

コードは、Some2 (スプライト) が Some1 (スプライト) の多くの子を持つように構成されています。Some2 では、Some1 スプライトで MouseEvent.MOUSE_UP イベントをリッスンし、そのリスナーで伝播を停止し、カスタム Some2Event をディスパッチしています。

    private function mouseUpHandler(event:MouseEvent):void{
        event.stopImmediatePropagation();
        var ev:Some2Event=new Some2Event(Some2Event.MOUSE_UP);
        ev.node2=this;
        dispatchEvent(ev);

Some2 には、次の登録済みイベント リスナーがあります。

    private function registerListeners():void
    {
        addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); //detects mouse up on Some2 Sprite
        addEventListener(Some1Event.MOUSE_UP, some1MouseUpHandler); //detects mouse up on Some1 Sprite, custom event, Some1 mouse up stopped in Some1
        addEventListener(Event.ADDED, addedHandler); //detecting add of child Some1
    }

Some1Event と Some2Event はほぼ同じです。

import flash.display.Sprite;
import flash.events.Event;


public class Some1Event extends Event
{

    public static const MOUSE_DOWN:String = "MOUSE_DOWN";
    public static const MOUSE_UP:String = "MOUSE_UP";

    public var node:Sprite;

    public function Some1Event(type:String, bubbles:Boolean=true, cancelable:Boolean=false)
    {
        super(type, bubbles, cancelable);
    }
    public override function clone():Event
    {
        return new Some1Event(type, bubbles, cancelable);
    }

}

と Some2Event:

import flash.display.Sprite;
import flash.events.Event;

public class Some2Event extends Event
{
    public static const MOUSE_DOWN:String = "MOUSE_DOWN";
    public static const MOUSE_UP:String = "MOUSE_UP";

    public var node2:Sprite;

    public function Some2Event(type:String, bubbles:Boolean=true, cancelable:Boolean=false)
    {
        super(type, bubbles, cancelable);
    }

    public override function clone():Event
    {
        return new Some2Event(type, bubbles, cancelable);
    }

}

どんな助けでも大歓迎です。

4

1 に答える 1

1

Some1Eventの定数:

public static const MOUSE_DOWN:String = "MOUSE_DOWN";
public static const MOUSE_UP:String = "MOUSE_UP";

Some2Eventの定数:

public static const MOUSE_DOWN:String = "MOUSE_DOWN";
public static const MOUSE_UP:String = "MOUSE_UP";

いずれの場合も定数値は同じです。'MOUSE_DOWN'または'MOUSE_UP'。Flexが2つの違いをどのように見分けると思いますか?できません!定数値を一意になるように変更します

Some1Eventの場合:

public static const MOUSE_DOWN:String = "MOUSE_DOWN_SOME1";
public static const MOUSE_UP:String = "MOUSE_UP_SOME1";

Some2Eventの場合:

public static const MOUSE_DOWN:String = "MOUSE_DOWN_SOME2";
public static const MOUSE_UP:String = "MOUSE_UP_SOME2";

これで、Flexは2つのイベントを異なる/一意であると見なし、一方のイベントがディスパッチされたときに、一方のイベントのリスナーを呼び出しません。

于 2012-07-16T13:54:23.523 に答える