2010-07-09 5 views
0

J'ai un problème dans un ItemRenderer dans Flex 3.5. J'ai regardé les autres messages concernant cette erreur mais ne peux toujours pas le comprendre. Le ItemRenderer fait partie d'un AdvancedDataGrid dont le fournisseur de données est HierarchicalData. Je reçois l'ArgumentError mais la trace ne va pas à mon code. Je suis passé en mode débogage des tonnes de fois, mais il semble que cela ne se produise qu'après l'exécution de mon code. Assez étrange.Flex ArgumentError: erreur n ° 2025 dans ItemRenderer

Le rendu d'élément comporte plusieurs parties différentes. Il détermine la ligne sur laquelle il doit dessiner, en fonction des données xml, puis ajoute des étiquettes et des sprites de manière appropriée. Si quelqu'un peut aider, ce serait une aide précieuse! Merci!

Voici l'une des méthodes qui est appelée si l'itemrenderer est sur une certaine ligne.

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); 

    } 

Il y a une autre fonction qui est appelée sur une autre ligne, mais si je commente le code ci-dessus tout fonctionne très bien, donc je suppose que le problème est bien là. Merci pour l'aide!

est ici où addLabels est appelé:

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); 
    } 
    } 

Répondre

0

Voici la réponse si quelqu'un cherchait à ce .. Je suis toujours pas exactement le problème, mais AdvancedDataGrid n'a certainement pas aimé que j'ajoute un Label en tant qu'enfant au moteur de rendu. Voici comment je suis arrivé autour .. ajouter un champ de texte comme un enfant à l'image-objet, comme le montre:

 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); 

Hope this helps quelqu'un!

0

Je l'ai vu ce genre de chose auparavant. Cette erreur peut se produire dans AdvancedDataGrid lui-même, et non dans itemRenderer. Pour plus d'informations, voir http://www.judahfrangipane.com/blog/?p=196 pour plus d'informations.

Si vous voulez simplement dessiner quelque chose sur des lignes spécifiques, vous pouvez essayer de prolonger la AdvancedDataGrid pour remplacer deux fonctions:

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 
} 
+0

Je pense que vous avez raison à ce sujet. J'ai posté la trace de la pile ci-dessous et elle référence définitivement AdvancedDataGrid. – Craig

+0

Encore un peu confus ... Donc vous pensez que l'erreur pourrait se produire parce que la grille de données pense que les étiquettes et les sprites devraient en être des enfants, et non du rendu d'élément? – Craig

+0

Oui, quelque chose comme ça. Je ne sais pas exactement comment vous appelez addLabels() mais il semble que vos contextes deviennent confus. – Robusto

Questions connexes