2011-09-13 46 views
0

我写了一个类ANDGatter.as,它有4个子对象“AndIONode0-3”。看代码。我得到了拖放功能,但我添加eventlisteners的顺序似乎是错误的。我应该在addChild方法之前还是之后添加监听器?我尝试了两种方法,但是当在我的应用程序中实例化ANDGatter时,我在第一次拖放操作期间收到空指针异常。我怎样才能解决这个问题 ?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); 
    }  
} 

}

+0

其中在拖放过程中的作用或行导致异常的请求?在dragDropHandler函数期间使用 – HotN

+0

。我从一个实例拖动到第二个实例,然后显示alert.show。它在第二个拖动操作上工作。但是,我第一次得到错误。在应用程序内部,我只需做一个var andgatter1:AndGatter = new AndGatter()addChild(andgatter1),另一个用于andgatter2 – user932407

回答

1

在dragDropHandler(),如果引用startconnector.name。在调用mouseMoveHandler()之前不会分配startconnector,只有在将鼠标移到AndIONode0上时才会发生此情况。您可能需要调整要添加移动侦听器的AndIONode,以确保startconnector始终具有值。

0

下面的语句失败

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

造成endconnector

endconnector=dropTarget; 

到永远的DropTarget,这将基本上是空的对象。
空对象不具有属性。
所以

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

会报错,因为属性的空对象

endconnector.name