0

以前に計算したデータ (X,Y) に基づいてプロット チャートを生成するアプリケーションを作成しました。グラフにデータをプロットした後、ユーザーがドットをクリックしたときにアイテム (ドット) にラベルを表示するように (addChild 外部カスタム ラベル コンポーネントを介して) しようとしました (たとえば、ユーザーがチャート アイテムをクリックした場合、対応する ID 番号がドットの横に表示されます)。

すべて正常に動作しますが、項目を切り替えることはできません (たとえば、ドットが既にクリックされていてラベル ID が表示されている場合、次に同じドットをクリックすると、それに対応するラベル コンポーネントを非表示 (removeChild) にしたい) item)...これまでに行ったことの簡単なサンプル コードが添付されています。

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="417" height="468" backgroundGradientAlphas="[1.0, 1.0]" backgroundGradientColors="[#FFFFFF, #FFFFFF]">
    <mx:Script><![CDATA[
    import mx.charts.events.ChartItemEvent;
    import mx.charts.HitData;
     import mx.collections.ArrayCollection;

     [Bindable]
     public var ARR:ArrayCollection = new ArrayCollection([
        {ID:1, Y:2000, X:1500},
        {ID:2, Y:1000, X:200},
        {ID:3, Y:1500, X:500},
        {ID:4, Y:500, X:300},
        {ID:5, Y:1000, X:450},
        {ID:6, Y:2000, X:500}
     ]);

     private function labels_plot1(plot:String, dotIndex:int, labelID:String):void {
            var ID_lab:ID_label = new ID_label();
            if(this[plot].series[0] == ID_lab.parent){
                this[plot].series[0].removeChild(ID_lab);
            }else{
                this[plot].series[0].addChild(ID_lab);
                ID_lab.x = this[plot].series[0].getChildAt(dotIndex).x + 8;
                ID_lab.y = this[plot].series[0].getChildAt(dotIndex).y + 1.2;
                ID_lab.ID_txt.htmlText = "<B>" + labelID  + "</B>";
            }
     }

     private function dotClickEvent(event:ChartItemEvent):void{
        labels_plot1(event.currentTarget.id, event.hitData.chartItem.index, event.hitData.item.ID);
     }

  ]]></mx:Script>
     <mx:PlotChart id="myChart" dataProvider="{ARR}" itemClick="dotClickEvent(event)">
        <mx:series>
           <mx:PlotSeries id="pl"
                xField="X"
                yField="Y"
                displayName="Plot 1"
            />
        </mx:series>
        <mx:annotationElements>
            <mx:CartesianDataCanvas id="canvas" includeInRanges="true"/>
        </mx:annotationElements>
     </mx:PlotChart>
</mx:WindowedApplication>

私はほとんどすべてを試しましたが、成功しませんでした... この問題を解決するにはどうすればよいですか?

4

1 に答える 1

0

関数の最初のチェックは真ではありませんでした。そのため、子は削除されません。まず第一に、新しいラベルが必要かどうかを知る前に、新しいラベルを作成しないでください。

あなたの場合、コンポーネントのプロパティ名を使用してそこに dotIndex を保存します。dotIndex は一意であるため、関数 getChildByName(dotIndex.toString()) を使用してラベルが存在するかどうかをいつでも確認できます。

また、新しいラベルを別のコンテナーに直接追加するか、この場合はアプリケーション自体に追加することを好みます。ここにあなたがしようとすることができる何かがあります:

        private function labels_plot1(plot:String, dotIndex:int, labelID:String):void {

            var dispObj:DisplayObject = this.getChildByName(dotIndex.toString());

            if (dispObj != null)
            {
                this.removeChild(dispObj);
            }
            else
            {
                var ID_lab:Label = new Label();

                ID_lab.x = this[plot].series[0].getChildAt(dotIndex).x + 8 + 60;
                ID_lab.y = this[plot].series[0].getChildAt(dotIndex).y + 1.2 + 4;

                ID_lab.text = labelID;
                ID_lab.name = dotIndex.toString();
                this.addChild(ID_lab);
            }
        }

コンポーネント ID_Label がないため、ここでは通常のラベルを使用しました。

于 2012-12-26T11:32:25.353 に答える