Actionscript 3 AS3:构造自定义类

Actionscript 3 AS3:构造自定义类,actionscript-3,flex4,Actionscript 3,Flex4,我编写了一个类ANDGatter.as,它有4个子对象“AndIONode0-3”。参见代码。我使用了拖放功能,但是我添加eventlisteners的顺序似乎是错误的。我应该在addChild方法之前还是之后添加侦听器?我尝试了这两种方法,但在应用程序中实例化2和gatter时,在第一次拖放操作期间,我得到了一个空指针异常。我怎样才能解决这个问题 package classes{ import classes.ConnectionLine; import flash.display.Displ

我编写了一个类ANDGatter.as,它有4个子对象“AndIONode0-3”。参见代码。我使用了拖放功能,但是我添加eventlisteners的顺序似乎是错误的。我应该在addChild方法之前还是之后添加侦听器?我尝试了这两种方法,但在应用程序中实例化2和gatter时,在第一次拖放操作期间,我得到了一个空指针异常。我怎样才能解决这个问题

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()中,您引用的是startconnector.name。在调用mouseMoveHandler()之前,不会分配startconnector,只有当您将鼠标移到AndionNode0上时才会发生这种情况。您可能需要调整要将移动侦听器添加到的AndIONodes,以确保startconnector始终具有值。

以下语句失败

if (event.dragSource.hasFormat('start')) {
引发端连接器

endconnector=dropTarget;
永远不会成为dropTarget,它基本上是一个空对象。
空对象将没有属性。
所以

将因请求空对象上的属性而出错

endconnector.name

在dragDropHandler函数期间,拖放过程中的哪个函数或行导致异常。我从一个实例拖动到第二个实例,然后显示alert.show。它在第二次拖动操作中起作用。但我第一次出错。在应用程序内部,我只需执行一个var和gatter1:AndGatter=newandgatter()addChild(andgatter1)和另一个andgatter2
endconnector.name