0

我在 Flex 3.5 的 ItemRenderer 中遇到了问题。我查看了有关此错误的其他帖子,但仍然无法弄清楚。ItemRenderer 是 AdvancedDataGrid 的一部分,其数据提供者是 HierarchicalData。我收到 ArgumentError 但跟踪没有转到我的任何代码。我已经在调试模式下经历了很多次,但它看起来直到我的代码运行后才会发生。很奇怪。

项目渲染器有几个不同的部分。它根据 xml 数据确定应该绘制的行,然后适当地添加标签和精灵。如果有人可以提供帮助,那将是一个很大的帮助!谢谢!

如果 itemrenderer 在某一行上,这是调用的方法之一。

private function addLabels(planList:ArrayCollection):void {
     height = 0;
     var sprite:Sprite = new Sprite();
     var curX:Number = (width / planList.length);
     height = 110;
     for each (var plan:Plan in planList) {
        var label:Label = new Label();
        label.text = plan.planner.label;

        label.rotationZ = 270;
        label.visible = true;
        label.x = curX - 7;

        //Draw line divider
        curX += (width / planList.length);
        addChild(label);
        label.move(label.x, height - 30);

        //Draw divider line
        sprite.graphics.lineStyle(.5, 0x000000);
        sprite.graphics.moveTo(label.x - ((width / planList.length) / 2) + 10.5, 0);
        sprite.graphics.lineTo(label.x - ((width / planList.length) / 2) + 10.5, height - 28);

        //Draw meatball
        sprite.graphics.beginFill(0x00FF33);
        sprite.graphics.drawCircle(label.x + 10, height - 15, 10);
        sprite.graphics.endFill();
     }
     rawChildren.addChild(sprite);

  }

还有另一个函数在不同的行上被调用,但如果我注释掉上面的代码一切正常,所以我的猜测是问题肯定出在那儿。谢谢您的帮助!

这里是 addLabels 被调用的地方:

override protected function createChildren():void {
     removeAllChildren();
     var count:int = rawChildren.numChildren;
     for (var i:int = 0; i < count; i++) {
        if (rawChildren.getChildAt(0).parent) {
           rawChildren.removeChildAt(0);
        }
     }
     var allPlans:ArrayCollection = new ArrayCollection();
     if (_plan) {
        getAllPlans(_plan, allPlans);
     }
     if (_name == "capability") {

     }
     else if (_name == "components") {
        height = 130;
        width = 335;
        addLabels(allPlans);  // <-- RIGHT HERE!
        var sprite:Sprite = new Sprite();
        sprite.graphics.lineStyle(.5, 0x000000);
        sprite.graphics.moveTo(0, 0);
        sprite.graphics.lineTo(width, 0);

        sprite.graphics.moveTo(0, height - 28);
        sprite.graphics.lineTo(width, height - 28);
        rawChildren.addChild(sprite);
     }
  }
4

2 回答 2

0

我以前见过这种东西。此错误可能发生在 AdvancedDataGrid 本身,而不是 itemRenderer。

请参阅http://www.judahfrangipane.com/blog/?p=196了解更多信息。

如果您只是想在特定行上绘制一些东西,您可以尝试扩展 AdvancedDataGrid 以覆盖两个函数:

override protected function drawHorizontalLine(s:Sprite, rowIndex:int, color:uint, y:Number):void {
  // do some drawing 
}

override protected function drawRowBackground(s:Sprite, rowIndex:int, y:Number, height:Number, color:uint, dataIndex:int):void {
  // do some drawing 
}
于 2010-07-09T17:54:44.600 回答
0

如果有人在看这个,这就是答案。我仍然不确定问题出在哪里,但 AdvancedDataGrid 肯定不喜欢我在渲染器中添加一个标签作为孩子。这是我解决它的方法.. 将 TextField 作为子项添加到精灵中,如图所示:

        var newLabel:TextField = new TextField();
        newLabel.text = plan.planner.label;
        newLabel.rotationZ = 270;
        newLabel.visible = true;
        newLabel.x = curX - (dividerWidth / 2) - ((newLabel.textHeight) / 1.5);
        newLabel.y = height - (RADIUS * 2.5);
        newLabel.antiAliasType = AntiAliasType.ADVANCED;

        sprite.addChild(newLabel);

希望这对某人有帮助!

于 2010-07-09T23:46:28.777 回答