0

Flec Bar チャートがあります。バーシリーズがあります。バーの先端にデータラベルを表示する必要があります。これには labelFunction を使用しています。これは正常に機能します。今、同じチャートにプロットシリーズを追加したいと思います。それが追加されると、棒シリーズのラベル関数は機能しません。ラベルは表示されません。

<mx:Application  xmlns:mx="http://www.adobe.com/2006/mxml">          
  <mx:Script><![CDATA[
    import mx.charts.series.items.PlotSeriesItem;
    import mx.charts.series.items.BarSeriesItem;
    import mx.charts.ChartItem;
    import mx.controls.Label;   
    import mx.collections.ArrayCollection;  
    //Dataprovider for chart    
[Bindable]
 private var medalsAC:ArrayCollection = new ArrayCollection([
{ Country: "USA", Gold: 35, Silver:39, Bronze: 29,prevRank:"1",isIncrease:true },
{ Country: "China", Gold: 32, Silver:17, Bronze: 14,prevRank:"2",isIncrease:false }
 ]);
     private function setCustomLabel(element:ChartItem):String {                  
var data:BarSeriesItem = BarSeriesItem(element);      
 return (data.item.prevRank).toString();    
     }
 public function init(element:Object):String {
                    var data:PlotSeriesItem = PlotSeriesItem(element);                      
                    if(data.item.isIncrease){    
                            return "images/increase.png";
                    }
                    else{
                            return "images/decrease.png";         
                    }          
     }
]]></mx:Script>
 <mx:VBox>
<mx:BarChart id="bar" showDataTips="true"
            dataTipMode="multiple" >           
            <mx:verticalAxis>
                    <mx:CategoryAxis id="v1"  categoryField="Country"  dataProvider="{medalsAC}"/>
                </mx:verticalAxis>
                 <mx:verticalAxisRenderers>
                    <mx:AxisRenderer placement="left" axis="{v1}"
                        verticalAxisTitleAlignment="vertical">
                    </mx:AxisRenderer>                 
                </mx:verticalAxisRenderers>
            <mx:series>
                <mx:BarSeries id="bs2"
                    yField="Country" 
                    xField="Silver"                    
                   dataProvider="{medalsAC}" labelFunction="setCustomLabel"
                />
              <mx:PlotSeries id="plotSeries" yField="Country" xField="Silver"   dataProvider="{medalsAC}"                   
                    displayName="Current Trend">
                    <mx:itemRenderer>
                        <mx:Component>
            <mx:Image source="{outerDocument.init(data)}" horizontalAlign="center" height="16" width="16"/>
                        </mx:Component>
                    </mx:itemRenderer>
             </mx:PlotSeries>
            </mx:series>
        </mx:BarChart>

</mx:VBox>
</mx:Application>
4

1 に答える 1

1

次のようなことを試してください:

<mx:Application  xmlns:mx="http://www.adobe.com/2006/mxml">          
    <mx:Script>
        <![CDATA[
            import mx.charts.ChartItem;
            import mx.charts.chartClasses.Series;
            import mx.charts.series.items.BarSeriesItem;
            import mx.charts.series.items.PlotSeriesItem;
            import mx.collections.ArrayCollection;
            import mx.controls.Label;  

        //Dataprovider for chart    
        [Bindable]
        private var medalsAC:ArrayCollection = new ArrayCollection([
            { Country: "USA", Gold: 35, Silver:39, Bronze: 29,prevRank:"1",isIncrease:true },
            { Country: "China", Gold: 32, Silver:17, Bronze: 14,prevRank:"2",isIncrease:false }
        ]);

        private function setCustomLabel(element:ChartItem, series:Series):String
        {                  
            var data:BarSeriesItem = BarSeriesItem(element);      
            return (data.item.prevRank).toString();    
        }
        public function init(element:Object):String 
        {
            var data:PlotSeriesItem = PlotSeriesItem(element);    
            if(data && data.item)
            {
                if(data.item.isIncrease){    
                    return "images/increase.png";
                }
                else{
                    return "images/decrease.png";         
                }     
            }
            return "";
        }
    ]]>
    </mx:Script>
    <mx:VBox>
        <mx:BarChart id="bar" showDataTips="true" dataProvider="{medalsAC}"
                     dataTipMode="multiple" >           
            <mx:verticalAxis>
                <mx:CategoryAxis id="v1"  categoryField="Country"  dataProvider="{medalsAC}"/>
            </mx:verticalAxis>
            <mx:verticalAxisRenderers>
                <mx:AxisRenderer placement="left" axis="{v1}"
                                 verticalAxisTitleAlignment="vertical">
                </mx:AxisRenderer>                 
            </mx:verticalAxisRenderers>
            <mx:series>
                <mx:BarSeries id="bs2"
                              yField="Country" 
                              xField="Silver"        
                              labelPosition="inside"
                              labelFunction="setCustomLabel"
                              />
                <mx:PlotSeries id="plotSeries" yField="Country" xField="Silver" dataProvider="{medalsAC}"                   
                               displayName="Current Trend">
                    <mx:itemRenderer>
                        <mx:Component>
                            <mx:Image source="{outerDocument.init(data)}" horizontalAlign="center" height="16" width="16"/>
                        </mx:Component>
                    </mx:itemRenderer>
                </mx:PlotSeries>
            </mx:series>
        </mx:BarChart>

    </mx:VBox>
</mx:Application>

ただし、コードがごちゃごちゃしていて、Flex 4 が既にリリースされているのに Flex 3 を使用していると言わざるを得ません。アイテム レンダラーは別のクラスで作成し、null オブジェクトを常にチェックする必要があります。これは、エラーが発生する可能性があるためです (また発生する可能性があります)。

于 2011-08-01T06:29:46.583 に答える