我在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);
}
}
答案 0 :(得分: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
}
答案 1 :(得分:0)
如果有人在看这个,这就是答案。 我仍然不确定问题是什么,但是AdvancedDataGrid当然不喜欢我将一个Label作为子项添加到渲染器中。这是我如何解决它..将一个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);
希望这有助于某人!