             return;
         
         _label = value;
-        if (labelDisplay)
-            labelDisplay.text = _label;
+        // Defer setting the labelDisplay's text property to avoid extra computation, see updateMeasuredSize()
         
         dispatchChangeEvent("labelChanged");
     }


import mx.core.IUITextField;
import mx.core.LayoutElementUIComponentUtils;
import mx.core.UIComponent;
import mx.core.UITextField;
import mx.events.FlexEvent;

    /**
     *  @private
     *  Watch Out: this code relies on the fact that UITextField/setActualSize() can cause
     *  labelDisplay.textHeight to change, if the text wraps.  The textfield's measuredHeight
     *  is just a padded version of textHeight.  This is the only place where labelDisplay.setActualSize() 
     *  is called, so we update the measuredHeight of this render here.  Very unconventional.
     *  Doing so is essential because after this code runs, i.e. after GridLayout/layoutItemRenderer()
     *  invokes validateNow() on this renderer, it uses the renderer's preferredBoundsHeight()
     *  (that's the measuredHeight in our case) to update the overall row height.
     */
    override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
    {
        super.updateDisplayList(width, height);

        if ((unscaledWidth == 0) || (unscaledHeight == 0))
            return;
        
        const labelDisplayX:int = 5;
        const labelDisplayY:int = 5;
        const labelDisplayWidth:int = unscaledWidth - (WIDTH_PADDING - labelDisplayX); 
        const labelDisplayHeight:int = unscaledHeight - (HEIGHT_PADDING - labelDisplayY);
        
        labelDisplay.setActualSize(labelDisplayWidth, labelDisplayHeight);  // setActualSize() side-effects labelDisplay.textHeight
        updateMeasuredSize();  // See @private comment above 
        
        labelDisplay.move(labelDisplayX, labelDisplayY);
    }
 
        
