2011-09-13 2 views
0

4つの子オブジェクト "AndIONode0-3"を持つANDGatter.asクラスを作成しました。コードを参照してください。私はドラッグドロップ機能が動作しているが、私はeventlistenersを追加する順序が間違っているようだ。 addChildメソッドの前または後にリスナーを追加する必要がありますか?私は両方の方法を試してみましたが、アプリケーションに2つのANDGatterをインスタンス化すると、最初のドラッグアンドドロップ操作でNullポインタ例外が発生します。これをどうすれば解決できますか?AS3:カスタムクラスの構造

package classes{ 
import classes.ConnectionLine; 
import flash.display.DisplayObject; 
import flash.events.MouseEvent; 
import mx.containers.Canvas; 
import mx.controls.Alert; 
import mx.core.DragSource; 
import mx.events.DragEvent; 
import mx.managers.DragManager; 

public class AndGatter extends Canvas 
{ 
    public var AndIONode0:Canvas; 
    public var AndIONode1:Canvas; 
    public var AndIONode2:Canvas; 
    public var AndIONode3:Canvas; 
    public var nodeWidth:int=10; 
    public var nodeHeight:int=10; 
    public var nodeColor:uint=0x919191; 
    public var gatterColor:uint=0x474747; 
    public var startconnector:DisplayObject; 
    public var endconnector:DisplayObject; 

    public function AndGatter() 
    { 
     super(); 
     super.width=50; 
     super.height=50; 
     this.setStyle("backgroundColor",gatterColor); 
     /*EingangsNode0 für AndGatter*/ 
     AndIONode0=new Canvas(); 
     AndIONode0.name="And Output Node"; 
     AndIONode0.width=nodeWidth; 
     AndIONode0.height=nodeHeight; 
     AndIONode0.x=40; 
     AndIONode0.y=20; 
     AndIONode0.setStyle("backgroundColor",nodeColor); 
     addChild(AndIONode0); 

     AndIONode1=new Canvas(); 
     AndIONode1.name="And Input Node 1"; 
     AndIONode1.width=nodeWidth; 
     AndIONode1.height=nodeHeight; 
     AndIONode1.x=0; 
     AndIONode1.y=5; 
     AndIONode1.setStyle("backgroundColor",nodeColor); 
     addChild(AndIONode1); 

     AndIONode2=new Canvas(); 
     AndIONode2.name="And Input Node 2"; 
     AndIONode2.width=nodeWidth; 
     AndIONode2.height=nodeHeight; 
     AndIONode2.x=0; 
     AndIONode2.y=20; 
     AndIONode2.setStyle("backgroundColor",nodeColor); 
     addChild(AndIONode2); 

     AndIONode3=new Canvas(); 
     AndIONode3.name="And Input Node 3"; 
     AndIONode3.width=nodeWidth; 
     AndIONode3.height=nodeHeight; 
     AndIONode3.x=0; 
     AndIONode3.y=35; 
     AndIONode3.setStyle("backgroundColor",nodeColor); 
     addChild(AndIONode3); 

     AndIONode0.addEventListener(MouseEvent.MOUSE_MOVE,mouseMoveHandler); 
     AndIONode1.addEventListener(DragEvent.DRAG_ENTER,dragEnterHandler); 
     AndIONode1.addEventListener(DragEvent.DRAG_DROP,dragDropHandler); 
     AndIONode2.addEventListener(DragEvent.DRAG_ENTER,dragEnterHandler); 
     AndIONode2.addEventListener(DragEvent.DRAG_DROP,dragDropHandler); 
     AndIONode3.addEventListener(DragEvent.DRAG_ENTER,dragEnterHandler); 
     AndIONode3.addEventListener(DragEvent.DRAG_DROP,dragDropHandler); 

    } 
    private function mouseMoveHandler(event:MouseEvent):void { 

     var dragInitiator:Canvas=Canvas(event.currentTarget); 
     startconnector=dragInitiator; 
     var ds:DragSource = new DragSource(); 
     ds.addData(id, 'start'); 
     DragManager.doDrag(dragInitiator, ds, event); 
    } 

    private function dragEnterHandler(event:DragEvent):void { 

     if (event.dragSource.hasFormat('start')) { 
      var dropTarget:Canvas=Canvas(event.currentTarget); 
      endconnector=dropTarget; 
      DragManager.acceptDragDrop(dropTarget); 
     } 
    } 

    private function dragDropHandler(event:DragEvent):void { 
     /*var connector:ConnectionLine = new ConnectionLine(startconnector,endconnector,true); 
     stage.rawChildren.addChild(connector);*/ 
     Alert.show("Verbindung hergestellt zwischen \n"+startconnector.name+" und "+endconnector.name); 
    }  
} 

} dragDropHandlerで

+0

の属性の要求のうち、エラーのでしょうか? dragDropHandler関数中に – HotN

+0

を呼び出します。あるインスタンスから2番目のインスタンスにドラッグして、alert.showを表示します。それは2回目のドラッグ操作で機能します。しかし、初めてエラーが発生します。アプリケーションの中で私は単にvarとgatter1を行います:AndGatter = new AndGatter()addChild(andgatter1)ともう一つはandgatter2 – user932407

答えて

1

()、あなたはstartconnector.nameを参照しています。 startconnectorは、mouseMoveHandler()が呼び出されるまで割り当てられません。これは、マウスをAndIONode0の上に移動すると発生します。 startconnectorが常に値を持っていることを確認するには、Moveリスナーを追加するAndIONodesを調整する必要があります。

0

次の文は、endconnector

endconnector=dropTarget; 

は、基本的にはnullオブジェクトになりますどのDropTargetにすることはないさせる

if (event.dragSource.hasFormat('start')) { 

を失敗しています。
ヌルオブジェクトには属性がありません。
だから、

Alert.show("Verbindung hergestellt zwischen \n"+startconnector.name+" und "+endconnector.name); 

があるため、ドラッグ&ドロッププロセスで例外が発生する機能やラインnullオブジェクト

endconnector.name 
関連する問題