0

Flex3.5のItemRendererで問題が発生しました。このエラーに関する他の投稿を見ましたが、それでも理解できません。ItemRendererは、データプロバイダーがHierarchicalDataであるAdvancedDataGridの一部です。ArgumentErrorが発生しますが、トレースが私のコードのいずれにも行きません。私は何度もデバッグモードを経験しましたが、コードが実行されるまでそれは起こらないようです。かなり奇妙。

アイテムレンダラーには、いくつかの異なる部分があります。xmlデータに基づいて、どの行を描画する必要があるかを判断し、ラベルとスプライトを適切に追加します。誰かが助けることができれば、それは大きな助けになるでしょう!ありがとう!

これは、itemrendererが特定の行にある場合に呼び出されるメソッドの1つです。

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 は確かに、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);

これが誰かを助けることを願っています!

于 2010-07-09T23:46:28.777 に答える
0

私は前にこの種のものを見たことがあります。このエラーは、itemRenderer ではなく、AdvancedDataGrid 自体で発生している可能性があります。

詳細については、 http://www.judahfrangipane.com/blog/?p=196を参照してください。

特定の行に何かを描画したいだけの場合は、AdvancedDataGrid を拡張して 2 つの関数をオーバーライドしてみてください。

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 に答える