I have been grappling with a similar issue. I put this down a week or so ago but I was next going to try and invalidate the stage and see what happened. Something along the lines of Stage.invalidate(). Worth a try.
--- In [email protected], "carl_steinhilber" <[EMAIL PROTECTED]> wrote: > > I asked this earlier and didn't get any response... but I think maybe > I hijacked another thread, so I'll ask again as it's own topic. > > I have a PlotChart that uses a custom itemRenderer. The dataProvider > bound to the chart has objects with the keys: > - xAxis:Number, which translates to the position on the xAxis of > the chart (-10 to 10), as the value moves to negative, the items color > changes from green to orange to red > - yAxis:Number, which translates to the position on the yAxis of > the chart (-10 to 10), as the value moves to negative, the items color > changes from green to orange to red > - size:Number, which translates to the size of the item (diameter > of circle) > - visible:Boolean, which determines whether the item is actually > plotted on the chart or not > > At runtime, the chart initially loads exactly as expected (items the > correct size, color and position). Then if I update the values for > xAxis and/or yAxis, the item moves on the chart as expected (though if > it moves from a positive value to negative value on either axis, the > color remains green). > But if I update the value for size it doesn't update the item on the > chart, and if I update visible to false the item remains visible. > > Obviously the data setter function in my itemRenderer class is not > called when I expect. > > Also, if I completely replace the dataProvider with a new object, item > 1 retains the color and size of item 1 in the old data, and so on. > > I've tried explicitly calling invalidateDisplayList() and > validateNow() on the chart, but it seems to just run the > updateDisplayList(). This makes some sense... I guess set data is only > run when the chart is first initialized. Seems like I really want the > bulk of the logic that's currently in the data setter to be in the > updateDisplayList() function... but I don't seem to have access to the > dataProvider data in that function. > > How do I force the chart to rerun the renderer for the item(s) with > updated data? Or, conversely, how do I get at dataProvider values from > the updateDisplayList() function in the class? > > Any help would be appreciated. > > Thanks in advance! > -Carl > > > Here's the class > ================================================== > package > { > import mx.skins.ProgrammaticSkin; > import flash.geom.Rectangle; > import mx.graphics.*; > import flash.display.Graphics; > import mx.core.IDataRenderer; > > import mx.charts.ChartItem; > import flash.events.MouseEvent; > import mx.core.UIComponent; > import mx.controls.Label; > import mx.charts.PlotChart; > import mx.charts.series.items.PlotSeriesItem; > > > public class ClientItemRenderer extends UIComponent implements > IDataRenderer > { > private var _label:Label; > private var _status:Label; > private var _itemFill:uint; > private var _itemVisible:Boolean; > private var _itemSize:int; > private var _itemXAxis:int; > private var _itemYAxis:int; > > public function ClientItemRenderer() > { > super(); > _label = new Label(); > addChild(_label); > _label.setStyle("color",0x000000); > _status = new Label(); > addChild(_status); > _status.setStyle("color",0x000000); > } > private var _chartItem:ChartItem; > > public function get data():Object > { > return _chartItem; > } > > public function set data(value:Object):void > { > if (_chartItem == value) > return; > _chartItem = ChartItem(value); > _itemVisible = false; > > if(_chartItem != null){ > _itemXAxis = _chartItem.item.xAxis; > _itemYAxis = _chartItem.item.yAxis; > > var size = _chartItem.item.size; > _itemSize = 1; > if (int(size) > 250000) > _itemSize = 2; > if (int(size) > 500000) > _itemSize = 3; > if (int(size) > 750000) > _itemSize = 4; > if (int(size) > 999999) > _itemSize = 5; > > if (String(_chartItem.item.visible)=="True") > _itemVisible = true; > > _label.text = _chartItem.item.clientname; > _status.text = String(_itemSize); > > _itemFill = 0xFFA023; > if (_itemXAxis < 0 && _itemYAxis < 0) > _itemFill = 0xFF0000; > if (_itemXAxis >= 0 && _itemYAxis >= 0) > _itemFill = 0x26B417; > } > > } > > private var _over:Boolean = false; > > private static var rcFill:Rectangle = new Rectangle(); > > private function rollOver(e:MouseEvent):void > { > _over = true; > invalidateDisplayList(); > } > private function rollOut(e:MouseEvent):void > { > _over = false; > invalidateDisplayList(); > } > > override protected function updateDisplayList(unscaledWidth:Number, > unscaledHeight:Number):void > { > super.updateDisplayList(unscaledWidth, unscaledHeight); > if (_itemVisible){ > var fill:* = (_over)? 0x0000FF:_itemFill; > var stroke:IStroke = getStyle("stroke"); > var w:Number = (_itemSize - 1) * 4; > rcFill.right = unscaledWidth; > rcFill.bottom = unscaledHeight; > > var g:Graphics = graphics; > g.clear(); > if (stroke) > stroke.apply(g); > if (fill is IFill) > fill.begin(g, rcFill); > else if (fill is Number) > g.beginFill(fill); > g.drawCircle( unscaledWidth / 2, > unscaledHeight / 2, > unscaledWidth / 2 + w); > if (fill is IFill) > fill.end(g); > else if (fill is Number) > g.endFill(); > > > _label.setActualSize(_label.getExplicitOrMeasuredWidth(),_label.getExplicitOrMeasuredHeight()); > _label.move(unscaledWidth/2 - > _label.getExplicitOrMeasuredWidth()/2,- (15 + w)); > } > } > } > } >

