2011-07-28 14 views
2

y軸にラベル以外の画像を配置しようとしています。そこで、私はカスタムラベルレンダラーを作成しました(HBoxはとを含んでいます)。イメージのソースは、データプロバイダに存在するプロパティに基づいて設定する必要があります。問題は、fnSetSource()メソッドのBarSeriesItemにアクセスできないことです。どんな助けや指針も大変ありがとうございます。 ここにコード全体があります。フレックスバーチャートでy軸以外の画像/アイコンを表示

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
     layout="vertical" 
     width="1280" height="750"> 
    <mx:Script><![CDATA[ 
    import mx.collections.ArrayCollection; 
    import mx.charts.series.items.PlotSeriesItem; 
    import mx.controls.Label; 
    import mx.controls.Image; 
    import mx.containers.HBox; 
    import mx.charts.series.items.BarSeriesItem; 
    import mx.charts.series.ColumnSeries; 
    import mx.charts.series.items.ColumnSeriesItem; 
    import mx.charts.chartClasses.Series; 
    import mx.charts.ChartItem; 
    [Bindable] 
public var employeedetails:ArrayCollection = new ArrayCollection([    
{rank:"10",emplName:"Peter",prevRank:"7",imgSource:"images/increase.png"}, 
{rank:"9",emplName:"Mark",prevRank:"3",imgSource:"images/decrease.png"}, 
{rank:"8",emplName:"Eric",prevRank:"8",imgSource:"images/decrease.png"} 


]); 
    ]]> 
    </mx:Script>  


    <mx:BarChart id="bar" height="100%" 
      paddingLeft="15" paddingRight="5" 
      showDataTips="true" width="847" 
      dataTipMode="multiple" > 
      <mx:verticalAxis> 
       <mx:CategoryAxis id="v1" categoryField="emplName" dataProvider="{employeedetails}"/> 
      </mx:verticalAxis> 

      <mx:verticalAxisRenderers> 
       <mx:AxisRenderer placement="left" axis="{v1}"> 
        <mx:labelRenderer> 
         <mx:Component> 
          <mx:HBox width="100%" height="100%" minWidth="120" minHeight="20"> 
           <mx:Image id="axisImage" height="16" width="16" source="fnSetSource()"> 
            <mx:Script><![CDATA[ 
             import mx.charts.chartClasses.Series; 
             import mx.charts.ChartItem; 
             import mx.charts.series.items.BarSeriesItem;           
             [Bindable] 
             public function fnSetSource(element : ChartItem, series : Series) : String 
             { 
             var data : BarSeriesItem = BarSeriesItem(element); 
             var imgSrc : String = ""; 
             if (data.item.isIncrease) 
             { 
             imgSrc = "images/increase.png"; 
             } else if (data.item.isDecrease) 
             { 
             imgSrc = "images/decrease.png"; 
             } 
             else 
             { 
             imgSrc = ""; 
             } 
             return imgSrc; 
             } 
            ]]></mx:Script> 
           </mx:Image> 
           <mx:Label id="axisLabel" fontSize="12" width="100%" height="100%"> 
            <mx:Script><![CDATA[ 
             [Bindable] 
             override public function set data(value : Object) : void 
              { 
              if (value == null) 
              { 
               return; 
              } 
              var length : int = value.text.toString().length; 
              if (length > 15) 
              { 
               axisLabel.text = value.text.toString().substr(0, 15) + "..."; 
               axisLabel.toolTip = value.text; 
              } 
              else 
              { 
               axisLabel.text = value.text; 
              } 
             } 
            ]]> 
            </mx:Script> 
           </mx:Label> 
          </mx:HBox> 
         </mx:Component> 
        </mx:labelRenderer> 
       </mx:AxisRenderer> 
      </mx:verticalAxisRenderers> 
      <mx:series> 
       <mx:BarSeries id="bs2" 
       yField="emplName" 
       xField="rank" 
       displayName="Rank"  
       dataProvider="{employeedetails}"         
       />   
     </mx:series> 
    </mx:BarChart> 
</mx:Application> 
+0

私たちがこの例を実行できるようにコードを含めることができれば(誰かにアップロードすることができれば)、誰かがおそらく答えを持っているでしょう...フォーマットされていないコードを読むことはできません:) – Ryan

+0

コードを[リンク](http://livedocs.adobe.com/flex/3/html/help.html?content=charts_types_03.html)に置き換え、dataproviderをpublic var expensesで置き換えます。ArrayCollection = new ArrayCollection([ {月: "Jan"、利益:2000、費用:1500、isIncrease:true} 、 {Month: "Feb"、Profit:1000、Expenses:200、isDecrease:false}、 {月: "Mar"、Profit:1500、Expenses:500、isIncrease:true} ]); isIncreaseがtrueに設定されている場合は、y軸にmonthの横にアイコンを配置する必要があります。falseに設定すると、別のアイコンを配置する必要があります。 – Abi

+0

こんにちはブライアン、私は元の質問を編集し、コード全体を与えている。問題は、fnSetSource()でイメージのソースを設定しようとしていますが、空白になっています。助けてください。軸レンダラのチャートデータ項目で値を取得するのは正しいことですか? – Abi

答えて

0

私はコードを簡単に見ました。 fnSetSource()関数は、中かっこの中に置かれるまで呼び出されません。source = "{fnSetSource()}"

これは関数を呼び出すようになりますが、fnSetSource fnSetSource関数が必要とする2つのパラメータがありません。私が言及した最初の変更を行い、そこからそれを理解することができるかもしれません。

別個のmxmlコンポーネントであるアイテムレンダラーを作成できませんか?

+0

こんにちは、遅れてご返事申し訳ありません。私は別のアプローチで機能を持っています。誰かにとって有益だと思ってここに投稿してください。フォームアイテムを拡張するカスタムコンポーネントFormItemWithImageを作成してください。このコンポーネントでは、画像をcreatChildrenメソッドで追加することができます。画像のソースとラベルのテキストは、mxmlから供給されます。それは絶対にうまく動作します。貴重な情報をいただきありがとうございます。 – Abi

+0

@Abi - 私は楽しみにしていることを楽しみにしています、ありがとう – Ryan

0

あなたはfnSetSourceは()あなたがそれらの2つのパラメータを渡す刚性ので、それは動作しません必要なすべてのパラメータを渡していないように見える。.. このよう fnSetSource(値あなたの関数を使用します。オブジェクト、previousValue:オブジェクト、軸:IAxis ):String

関連する問題