2011-08-05 15 views
1

スパーク・ラベルのテキストを設定し、幅に応じてそのラベルをx軸に沿って配置する必要があります。残念ながら、ラベルの幅が直ちに更新されないため、配置が失敗するようです。私はラベルのupdateCompleteイベントを聞いてその位置を更新することができますが、これはラベルの位置を頻繁に変更することを意味します(updateCompleteは幅の変更より頻繁に発生します)。些細なことであると思われるものを適切に処理する方法に関するアイデアはありますか?スパーク・ラベルの幅

ここに、私が上で説明した内容を示すコードスニペットがあります。ボタンを押すと、テキストを変更する前のラベルの幅、テキストの設定直後、およびラベルの更新が完了したときの3つのトレースが表示されます。ボタン... updateCompleteイベントに耳を傾けることなく、正しい幅を取得する方法はありますかどうかを知るのが大好きとVGroupsは

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"> 

    <fx:Script> 
     <![CDATA[ 
      import mx.events.FlexEvent; 
      protected function button1_clickHandler(event:MouseEvent):void 
      { 
       trace("label width = ", lb.width); 
       lb.addEventListener(FlexEvent.UPDATE_COMPLETE, lb_updateCompleteHandler); 
       lb.text = "hello world!"; 
       trace("label width post change= ", lb.width); 
      } 

      protected function lb_updateCompleteHandler(event:FlexEvent):void 
      { 
       lb.removeEventListener(FlexEvent.UPDATE_COMPLETE, lb_updateCompleteHandler); 
       trace("label width post update complete = ", lb.width); 
      } 

     ]]> 
    </fx:Script> 

    <s:VGroup> 
     <s:Button label="go" click="button1_clickHandler(event)"/> 
     <s:Label id="lb" text="h" x="10" y="10" /> 
    </s:VGroup> 

</s:Application> 
+0

私はあなたの希望のレイアウトを理解していません、あなたは物事をどのように表示するか、実際にどのように表示されているかを別の言葉で説明しようとすることができますか? –

+0

ラベルの幅に応じてx位置を指定したい。これは少し一般的ですが、想像するのは難しいことではありません... –

+1

正確に何を達成しようとしていますか?私は最終結果がどのように見えるのでしょうか?おそらくあなたはスクリーンショットを投稿する可能性があります。私は、あなたが何か難しいことをやろうとしていると感じていますが、わかりません。 – RIAstar

答えて

0

リサイズイベントのリスニングは、トリックを行い、updateCompleteイベントと同じくらい一般的ではないので、私は「正解」と呼んでいます。パフォーマンスの最適化のために手作業でポジションを決めようとしているときにこれを行うより良い方法があるかもしれませんが、まだ何がわかりません。

1

VGroupVerticalLayoutGroupある例を実行するだけであるだろう。グループ内にカスタム配置することはできません(xy)。この可能性を持たせるには、Groupと(デフォルト)BasicLayoutを使用してください。

+0

申し訳ありません - VGroupは質問とは何の関係もなく、ボタンとラベルを別々に配置する方法でした。 –

-1

テキストを設定した後でlb.validateNow()を呼び出すことができます。この方法で、すぐに新しい幅が得られます。しかし、コンポーネントのライフサイクルについて、そんなに簡単な質問をしないように読んでみることをお勧めします。

はい、既に指摘されているように、このようなレイアウトでは再配置はできません。

+0

私はvalidateNowを試していましたが、驚くべきことに、この場合のトリックをしていないように見えます。なぜそうは思わないのですか?私の再編集で言及したように、レイアウトは質問とは関係ありません。 –

1

callLater()を使用すると、現在のスコープ内の変数を「キャプチャ」できますが、widthの変更が反映された後で実行されることもあります。たとえば、次のように

callLater(function():void 
     { 
     trace("label width in callLater = ", lb.width); 
     }); 

はUPDATE:私は私が「キャプチャ」の値によって何を意味するのか明確にするためにもう少し詳しく説明すべきだと思います。たとえば、あなたは(prevWidthなり、すなわち、[lb.width])が現在の値(つまりを取るargsアレイを介して渡すパラメータを示していたよう

callLater(function(prevWidth:Number):void 
     { 
     trace("previous label width in callLater = ", prevWidth); // 8 
     trace("label width in callLater = ", lb.width); // 64 
     }, [lb.width]); 

、これは、以下の簡単なイラストで行うことができます。値渡し)、関数内で直接参照する変数は、実際に関数が実行されたときのスコープ内にあります(つまり、closure)。

これもイベントリスナーで行うことができますが、callLater()では少しシンプルです。

+0

cool - thanks! –

2

以下は私のために働いた。シンプルでありながら機能します。

var l:Label = new Label(); 
l.text = "That'll do"; 
var tlm:TextLineMetrics = l.measureText(l.text); 
Alert.show(tlm.width + " is what you are looking for");