2011-08-05 161 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

VGroupGroupVerticalLayout。它不允許在組內定製定位(使用xy)。要有這種可能性,使用Group(默認)BasicLayout

+0

對不起 - VGroup與這個問題無關,它只是一種獨立定位按鈕和標籤的方法。會編輯這個問題 - 我在編寫它時顯然做得不好:-) –

-1

設置文本後,您可以調用lb.validateNow(),這樣您將立即得到新的寬度。但建議您閱讀組件生命週期,不要有這樣的小問題。

是的,正如人們已經指出,沒有重新定位將與這樣的佈局。

+0

我曾嘗試過validateNow,但在這種情況下似乎沒有辦法實現 - 不知道爲什麼。正如我在我的重新編輯提到的佈局與問題無關... –

1

如果您使用callLater(),您可以「捕獲」當前範圍內的變量,但也可以在傳播width中的變更後執行。例如:

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

更新:我覺得我應該更詳細一點要明確我的意思是「捕獲」的價值觀。這可以用下面的簡單的說明來完成:

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

作爲實施例證明,您通過args陣列中傳遞的參數(即,成爲prevWidth[lb.width])取當前值(即,。它們按值傳遞),而在函數中直接引用的變量實際上是函數執行時的範圍(即,一個closure)。

你也可以用事件監聽器來做到這一點,但是使用callLater()會更簡單一些。

+0

酷 - 謝謝! –

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");