Alex/Dan, Thanks to you both for your comments! Alex, I just took a quick look at your item rendered examples and I think that's going to be very helpful... Perhaps using styles (and the UITextField) will be a better approach because I'm not interested in mixing formats within the text field. Dan your comment about commitProperties gave me an idea. I noticed that commitProperties was only firing once per item renderer in my chat window. Having learned just now that renderers are recycled I think I may just need to add a call to invalidateProperties in my data setter below which would cause commitProperties to be fired each time the data is changed. Perhaps defaultTextFormat would be another solution.
Unfortunately, I'm don't get to do flex for my day job (yet!) so I'll have to try this out soon and post the results. Thanks! -James --- In [email protected], "Daniel Freiman" <[EMAIL PROTECTED]> wrote: > > I don't think TextFields are effected by styles (UITextFields are). It > might be easier to use UITextFields and use styles. > > Another possibility is that setting the text property reverts the > TextField's textformat. I forget if it reverts to the the format of the > first character or to the defaultTextFormat property of the TextField. If > it reverts to defaultTextFormat, then that might be where the problem is. > > Was commitProperties even being called when you had the format code in there > because I don't see where it would be called from in your code. > > Sorry for the scattered advice. > > - Dan Freiman > > > On 9/16/07, Alex Harui <[EMAIL PROTECTED]> wrote: > > > > Unless you want mixed formats, use styles instead of TextFormat, as the > > style system might be overriding your TextFormat. Also see the > > stylesFunction example on my blog (blogs.adobe.com/aharui) > > > > > > ------------------------------ > > > > *From:* [email protected] [mailto:flexcompone > > [EMAIL PROTECTED] *On Behalf Of *jandersen1978 > > *Sent:* Saturday, September 15, 2007 10:09 PM > > *To:* [email protected] > > *Subject:* [flexcomponents] Where/when to apply TextFormats in custom > > component? > > > > > > > > I've been struggling through one of my first custom components, a > > custom List item renderer for a simple list of chat messages with help > > from the Alex Harui of flex coders list (included below for > > reference). It's pretty much working now but I'm pretty sure there's > > room to improve. > > > > I want to apply a TextFormat to the two TextFields that I'm using in > > the renderer. Currently I'm applying it in the UpdateDisplayList > > method which is working but I'm sure it's very inefficient. > > > > First I tried applying the TextFormat object in the createChildren > > method but it seems to have no effect there (tried applying it both > > before and after calls to addChild()... ). > > > > I tried applying it in the commitProperties method which seems to make > > sense since the logic is only executed once there but I find that when > > the logic is there only the last chat message in the list takes the > > proper format, all others take the TextField default. Really not sure > > why existing instances of the item rendered are apparently losing > > their formatting as each new instance of the renderer is added to the > > list... Can anyone comment on why that might be happening? > > > > Where is the best spot to apply text formatting to textFields in a > > custom component? > > > > package org.rolera.kys.components > > { > > import mx.core.UIComponent; > > import mx.core.IDataRenderer; > > import mx.events.FlexEvent; > > import mx.controls.listClasses.IListItemRenderer; > > import mx.containers.HBox; > > import flash.text.TextField; > > import flash.text.TextFieldAutoSize; > > import flash.text.TextFormat; > > > > public class MessageRendererBase extends UIComponent implements > > IDataRenderer, IListItemRenderer > > { > > protected var _usr:TextField; > > protected var _msg:TextField; > > > > public function MessageRendererBase(){ > > > > } > > > > protected override function createChildren():void{ > > _usr = new TextField(); > > _msg = new TextField(); > > _msg.wordWrap = true; > > > > addChild(_usr); > > addChild(_msg); > > > > > > } > > > > protected override function commitProperties():void{ > > > > } > > > > protected override function measure():void{ > > if(!isNaN(this.explicitWidth)){ > > > > _usr.width = Math.round(this.explicitWidth * .19); > > _msg.width = Math.round(this.explicitWidth * .8); > > } > > this.measuredWidth = _usr.textWidth + _msg.textWidth; > > this.measuredHeight = _msg.textHeight; > > } > > > > protected override function updateDisplayList (unscaledWidth:Number, > > unscaledHeight:Number):void{ > > super.updateDisplayList(unscaledWidth, unscaledHeight); > > var tf:TextFormat = new TextFormat(); > > trace('expWidth: ' + this.explicitWidth + ' msgHeight: ' + > > _msg.height, _msg.text); > > tf.font = "Arial"; > > _usr.setTextFormat(tf); > > _msg.setTextFormat(tf); > > _msg.x = _usr.width + 3; > > > > } > > > > // Internal variable for the property value. > > private var _data:Object; > > > > // Make the data property bindable. > > [Bindable("dataChange")] > > > > // Define the getter method. > > public function get data():Object { > > return _data; > > } > > > > // Define the setter method, and dispatch an event when the property > > // changes to support data binding. > > public function set data(value:Object):void { > > _data = value; > > dispatchEvent(new FlexEvent(FlexEvent.DATA_CHANGE)); > > if(value != null){ > > _usr.text = value.fromName; > > _msg.text = value.message; > > _usr.textColor = _msg.textColor = value.color; > > } > > } > > > > } > > } > > > > > > >
