Creating a double-click-able Button control in Flex

by Peter deHaan on December 11, 2007

in Button

The following examples show how you can set a Flex Button control to listen for doubleClick events by setting the doubleClickEnabled property using both MXML and ActionScript.

Full code after the jump.

View MXML

<?xml version="1.0" encoding="utf-8"?>
<!-- http://blog.flexexamples.com/2007/12/11/creating-a-double-click-able-button-control-in-flex/ -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
        layout="vertical"
        verticalAlign="middle"
        backgroundColor="white">

    <mx:Script>
        <![CDATA[
            private function button_click(evt:MouseEvent):void {
                appendText(evt.type);
            }

            private function button_doubleClick(evt:MouseEvent):void {
                appendText(evt.type);
            }

            private function appendText(str:String):void {
                var now:Date = new Date();
                textArea.text += "[" + now.toTimeString() + "] " + str + "\\n";
                textArea.validateNow();
                textArea.verticalScrollPosition = textArea.maxVerticalScrollPosition;
            }
        ]]>
    </mx:Script>

    <mx:ApplicationControlBar dock="true">
        <mx:Form styleName="plain">
            <mx:FormItem label="doubleClickEnabled:">
                <mx:CheckBox id="checkBox"
                        selected="true" />
            </mx:FormItem>
            <mx:FormItem>
                <mx:Button id="button"
                        label="[double] click me"
                        doubleClickEnabled="{checkBox.selected}"
                        click="button_click(event);"
                        doubleClick="button_doubleClick(event);" />
            </mx:FormItem>
        </mx:Form>
    </mx:ApplicationControlBar>

    <mx:TextArea id="textArea"
            editable="false"
            width="50%"
            height="100%" />

</mx:Application>

View source is enabled in the following example.

You can also build the same sample as above using ActionScript, using the following code:

<?xml version="1.0" encoding="utf-8"?>
<!-- http://blog.flexexamples.com/2007/12/11/creating-a-double-click-able-button-control-in-flex/ -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
        layout="vertical"
        verticalAlign="middle"
        backgroundColor="white"
        creationComplete="init();">

    <mx:Script>
        <![CDATA[
            import mx.containers.ApplicationControlBar;
            import mx.containers.Form;
            import mx.containers.FormItem;
            import mx.controls.Button;
            import mx.controls.CheckBox;
            import mx.controls.TextArea;

            private var textArea:TextArea;

            private function init():void {
                // CheckBox
                var ch:CheckBox = new CheckBox();
                ch.selected = true;

                // FormItem #1 (for CheckBox)
                var fi1:FormItem = new FormItem();
                fi1.label = "doubleClickEnabled:";
                fi1.addChild(ch);

                // Button
                var btn:Button = new Button();
                btn.label = "[double] click me";
                btn.doubleClickEnabled = true;
                btn.addEventListener(MouseEvent.CLICK, button_click);
                btn.addEventListener(MouseEvent.DOUBLE_CLICK, button_doubleClick);

                // FormItem #2 (for Button)
                var fi2:FormItem = new FormItem();
                fi2.addChild(btn);

                // Form
                var f:Form = new Form();
                f.styleName = "plain";
                f.addChild(fi1);
                f.addChild(fi2);

                // ApplicationControlBar
                var appBar:ApplicationControlBar = new ApplicationControlBar();
                appBar.dock = true;
                appBar.addChild(f);
                addChild(appBar);

                // TextArea
                textArea = new TextArea();
                textArea.percentWidth = 50;
                textArea.percentHeight = 100;
                textArea.editable = false;
                addChild(textArea);
            }

            private function button_click(evt:MouseEvent):void {
                appendText(evt.type);
            }

            private function button_doubleClick(evt:MouseEvent):void {
                appendText(evt.type);
            }

            private function appendText(str:String):void {
                var now:Date = new Date();
                textArea.text += "[" + now.toTimeString() + "] " + str + "\\n";
                textArea.validateNow();
                textArea.verticalScrollPosition = textArea.maxVerticalScrollPosition;
            }
        ]]>
    </mx:Script>

</mx:Application>

{ 9 comments… read them below or add one }

1 Liceven June 2, 2008 at 4:35 am

It is very helpful.
Thanks very much

Reply

2 Prashant Khanal July 8, 2008 at 8:07 am

Is there any way you can isolate your double click event from click event. As you can see in your example double-click also fires click event which is very obvious but is there any way you can bypass the click event on doubleclick?

Reply

3 Noj July 9, 2008 at 11:23 pm

peterd, you saved me two hours of googling.

to Prashant Khanal: There is a similar problem with mouseWheel, it keeps on firing multiple times when you only have moved the mouseWheel by once. I was working on a project where i had someone’s mouse firing a +1, and -1 in pairs per every mouse Wheel move.

What i did, is add a buffer, meaning, every time the mousewheel moves, you add it to a value, if the value goes above a threshold , then and only then, the mouselistener is fired otherwise not.

you could do a similar thing for doubleClick . make a timer, after every click. if there is another double click fired. you only take double click in account.

however one bad thing adobe did for event listeners is that, they don’t show the list of events, listening for some kind of event.

Reply

4 Frank July 19, 2008 at 8:50 am

Thank you!

Reply

5 Prashant Khanal August 1, 2008 at 12:13 am

Hey Noj, Thank you

Reply

6 Cocodrillo March 24, 2009 at 6:01 am

I cannot see any difference between the enabled and disabled states.
disabled
[23:57:32 GMT+1000] click
[23:57:32 GMT+1000] click

enabled
[23:57:35 GMT+1000] click
[23:57:35 GMT+1000] click

Reply

7 Rob April 13, 2009 at 8:36 am

cocodrillo — With the enabled state selected, you can double click and the event is recorded.

Reply

8 Jelger Muylaert June 10, 2009 at 11:15 am

Anybody found a way to set the doubleClick interval time? you can set set the repeatInterval and delayInterval for a Button, but i can’t find the doubleClick-interval. (Google didn’t help)

Reply

9 Dogan Coruh July 24, 2009 at 4:58 am

There is no doubleClick interval time option. Flex always dispatches click event with doubleClick event. I think Adobe don’t want to miss any event because of propogation issues. But it is not useful for us with this form ha? :) You can manage it yourself by using a Timer object to wait for interval time. I have done it like that.

Reply

Leave a Comment

Sorry, this blog is terrible at eating HTML comments.
If you're pasting any HTML/XML/MXML code, you need to convert your < characters to &lt; and your > characters to &gt; .

You can use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">

Anti-Spam Protection by WP-SpamFree

Previous post:

Next post: