我在Flex3.5的ItemRenderer中遇到了一个问题。我已经看过关于这个错误的其他帖子,但仍然不能解决它。ItemRenderer是AdvancedDataGrid的一部分,后者的数据提供程序是HierarchicalData。我正在获取ArgumentError,但是跟踪没有到达我的任何代码。我已经在调试模式下经历了无数次,但它看起来直到我的代码运行后才会发生。很奇怪。
项目渲染器有几个不同的部分。它会根据xml数据计算出应该为哪一行绘制,然后适当地添加标签和子画面。如果有人能帮上忙,那将是一个很大的帮助!谢谢!
如果项目呈现器在某一行上,则会调用以下方法之一。
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);
}
}发布于 2010-07-10 07:46:29
这就是答案,如果有人看到这个的话..我仍然不确定问题出在哪里,但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-10 01:54:45
我以前见过这样的事情。此错误可能发生在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
}https://stackoverflow.com/questions/3215159
复制相似问题