public void visit(Node root, Point aPoint)
    {
        if(root.getVisit() == false){ root.setLocation(aPoint); }
        try
        {
            Thread.sleep(Const.SLEEP_TIME);
        }
        catch (InterruptedException anException)
        {
            System.err.println(anException);
            throw new RuntimeException(anException.toString());
        }
        this.model.changed();
        
        int childY = aPoint.y;
        int count=0;
        for(Node childNode : root.getChildren())
        {
            while(childY <= this.underLine) {childY += 18;} //現在一番下のNodeより下に描くために位置を調整
            this.visit(childNode,new Point(aPoint.x+root.getWidth()+Const.HORIZONTAL_GAP, childY)); //子Nodeを探索
            childNode.setVisit(true); //一度探索したら、座標を変更出来ないようにする
            count++;
            if(root.getChildren().size() > count){
                childY += Const.VERTICAL_GAP + root.getHeight(); //次の子を現在の位置より、2pixel開けた位置に描画
            }
        }
        
        if(this.underLine < childY) {this.underLine = childY;}
        if(root.getVisit() == false){root.setLocation( aPoint.x, (childY+aPoint.y+root.getHeight()) / 2 - (root.getHeight()/2) );}
        if(root.getParent()==null && root.getChildren().size()==1){ root.setLocation( aPoint.x, root.getChildren().get(0).getLocation().y);}
        
        return;
    }