07
Jan
08

Adding icons to the Flex ButtonBar control

The following example shows how you can add icons to the ButtonBar control in Flex.

Full code after the jump.

View MXML

<?xml version="1.0" encoding="utf-8"?>
<!-- http://blog.flexexamples.com/2008/01/07/adding-icons-to-the-flex-buttonbar-control/ -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
        layout="vertical"
        verticalAlign="middle"
        backgroundColor="white">

    <mx:Script>
        <![CDATA[
            [Bindable]
            [Embed("assets/Button.png")]
            private var buttonIcon:Class;

            [Bindable]
            [Embed("assets/ButtonBar.png")]
            private var buttonBarIcon:Class;

            [Bindable]
            [Embed("assets/CheckBox.png")]
            private var checkBoxIcon:Class;

            [Bindable]
            [Embed("assets/ColorPicker.png")]
            private var colorPickerIcon:Class;
        ]]>
    </mx:Script>

    <mx:Array id="arr">
        <mx:Object label="Button" icon="{buttonIcon}" />
        <mx:Object label="ButtonBar" icon="{buttonBarIcon}" />
        <mx:Object label="CheckBox" icon="{checkBoxIcon}" />
        <mx:Object label="ColorPicker" icon="{colorPickerIcon}" />
    </mx:Array>

    <!-- The data provider has an "icon" property. -->
    <mx:ButtonBar id="buttonBar"
            dataProvider="{arr}"
            height="32" />

</mx:Application>

View source is enabled in the following example.

The previous example works because the the data provider has an “icon” field, and the default value for the ButtonBar control’s iconField property is “icon”.

The following snippet shows how you can override the default value for the ButtonBar control’s iconField property in MXML:

<mx:Array id="arr">
    <mx:Object label="Button" img="{buttonIcon}" />
    <mx:Object label="ButtonBar" img="{buttonBarIcon}" />
    <mx:Object label="CheckBox" img="{checkBoxIcon}" />
    <mx:Object label="ColorPicker" img="{colorPickerIcon}" />
</mx:Array>

<!-- The data provider has an "img" property, so use ButtonBar
     control's iconField property to set the icons on the
     control. -->
<mx:ButtonBar id="buttonBar"
        dataProvider="{arr}"
        iconField="img"
        height="32" />

You could also set the iconField property using ActionScript, as shown in the following snippet:

<mx:Script>
    <![CDATA[
        import mx.events.FlexEvent;

        private function buttonBar_initialize(evt:FlexEvent):void {
            buttonBar.iconField = "img";
        }
    ]]>
</mx:Script>

<mx:Array id="arr">
    <mx:Object label="Button" img="{buttonIcon}" />
    <mx:Object label="ButtonBar" img="{buttonBarIcon}" />
    <mx:Object label="CheckBox" img="{checkBoxIcon}" />
    <mx:Object label="ColorPicker" img="{colorPickerIcon}" />
</mx:Array>

<mx:ButtonBar id="buttonBar"
        dataProvider="{arr}"
        height="32"
        initialize="buttonBar_initialize(event);" />

Or, the slightly more condensed version:

<mx:Array id="arr">
    <mx:Object label="Button" img="{buttonIcon}" />
    <mx:Object label="ButtonBar" img="{buttonBarIcon}" />
    <mx:Object label="CheckBox" img="{checkBoxIcon}" />
    <mx:Object label="ColorPicker" img="{colorPickerIcon}" />
</mx:Array>

<mx:ButtonBar id="buttonBar"
        dataProvider="{arr}"
        height="32"
        initialize="buttonBar.iconField = 'img';" />

9 Responses to “Adding icons to the Flex ButtonBar control”


  1. 1 dormouse Jan 8th, 2008 at 5:31 am

    very good

    enjoy

  2. 2 lili Jan 11th, 2008 at 9:56 pm

    Thank you you example it’s give me a lot of help

  3. 3 jeremie Mar 20th, 2008 at 7:20 am

    Thanks for the very good tutorial,

    I have a question. If I use a XML file as data provider and a repeater class to dynamically create buttons, is there a way to add a proper icon to the dynamically created buttons.

    Here is my code:

    <mx:Repeater id="toolBarRepeater" dataProvider="{toolBarData}">
    <mx:Button styleName="navbutton" name="{toolBarRepeater.currentItem.id}"
        click="setTransition(String(event.currentTarget.getRepeaterItem().state));"
        toolTip="{toolBarRepeater.currentItem.tooltip}"
        icon="HERE I WANT A DYNAMIC ICON"/>
    </mx:Repeater>
    

    I have an icon param in my xml but I alway have an ‘Invalid metadata format’ error.

    Thx!

  4. 4 peterd Mar 20th, 2008 at 8:15 am

    jeremie,

    Good question. What does your XML look like?

    Peter

  5. 5 jeremie Mar 21st, 2008 at 7:55 pm

    Hi,
    Here is a sample of my XML. I have tried several approach, but non of them worked. I put below what I’ve tried.

    <?xml version="1.0" encoding="UTF-8"?>
    <toolBar>
    
    	<toolBarItem>
    		<id>toDefaultBtn</id>
    		<state>default</state>
    		<tooltip>Home</tooltip>
    		<icon>@Embed("assets/icons/icon.png")</icon>
    	</toolBarItem>	
    
    	<toolBarItem>
    		<id>toCustomersBtn</id>
    		<state>customers</state>
    		<tooltip>Customers</tooltip>
    		<icon>{icon1}</icon>
    	</toolBarItem>
    
    	<toolBarItem>
    		<id>toStockBtn</id>
    		<state>stock</state>
    		<tooltip>Boutique Stock</tooltip>
    		<icon>icon2</icon>
    	</toolBarItem>
    
    </toolBar>
    

    Thx for your help!

  6. 6 dc Apr 9th, 2008 at 3:48 am

    I just got the metadata issue, I had Embed(/’assets/my.gif’).
    Also, not sure if it is the blog, but make sure it is normal quotes (”) rather than smart quotes

  7. 7 jeremie Apr 12th, 2008 at 3:32 am

    Hi dc
    Thanks for the reply, but I am not sure to understand what u mean

    Here is what I changed:

    <toolBarItem>
    	<id>toDefaultBtn</id>
    	<state>default</state>
    	<tooltip>Home</tooltip>
    	<icon>@Embed(/"assets/icons/icon.png")</icon>
    </toolBarItem>
    

    And here is the same error message:
    Error #1034: Type Coercion failed: cannot convert “@Embed(/”assets/icons/icon.png”)” to Class.

    Could u please send me the details of what u got to work please?
    Thx

  8. 8 alex Jul 17th, 2008 at 3:14 am

    what about using @Embed(’assets/icons/icon.png’) instead

  9. 9 alex Jul 17th, 2008 at 3:14 am

    i mean: & # 6 4 ; Embed(’images/icon8.png’)

Leave a Reply

This blog is terrible at eating HTML tags. If you plan on posting code/XML, please escape your "<" characters as "&lt;" and your ">" characters as "&gt;".