类中的flex按钮事件监听器

时间:2009-08-04 13:13:39

标签: flex class button event-handling flexbuilder

我在Main.mxml中有很多按钮。我正在尝试将按钮功能移动到类中,并让类内的事件监听器响应Click并调用其他函数。我写了:

Main.mxml

<mx:Button x="23.5" y="10" label="checker" click="{goListen()}" />
<mx:Button id="btnT1" x="252.5" y="10" label="t1" />
<mx:Button id="btnT2" x="309" y="10" label="t2"/>
<mx:Button id="btnT3" x="366" y="10" label="t3"/>

Main.as

private function goListen():void
    {
        var t:ButtonListener = new ButtonListener(btnT1, btnT2, btnT3);
    }

ButtonListener.mxml

package com.util

{     import flash.events.EventDispatcher;     import flash.events.MouseEvent;

import mx.controls.Alert;
import mx.controls.Button;

public final class ButtonListener extends EventDispatcher
{
    private var __btnArray:Array;

    public function ButtonListener(...btnList)
    {
        __btnArray = new Array();

        for each (var item:Button in btnList)
        {
            __btnArray.push(item);
        }

        buildListeners();
    }

    private function buildListeners():void
    {
        for each (var item:Button in __btnArray)
        {
            item.addEventListener(MouseEvent.CLICK, traceMe, false, 0, true);
        }
    }

    private function traceMe(event:MouseEvent):void
    {
        trace(event.target.label + " was clicked");
    }
}

}

因此,当我调试时,我看到数组填满了按钮,但traceMe()函数将无法工作。不知道我怎么能让它工作。或者我只需要在主类中有30个事件监听器和相应的函数。

2 个答案:

答案 0 :(得分:1)

由于Button bubbles的click事件,您只需在主应用程序文件上侦听click事件并委托给类中的处理函数。

或者您可以直接点击按钮调用处理程序。

private var controller:ButtonListener = new ButtonListener();

<mx:Button id="btnT1" x="252.5" y="10" label="t1" click="controller.handleClick(event)"/>

答案 1 :(得分:1)

看起来你有两种不同的选择或问题。如果您更改了最后一个参数:

item.addEventListener(MouseEvent.CLICK, traceMe, false, 0, true);

false,然后一切都应该有效,因为你的事件监听器会坚持处理鼠标点击。在课程中,这意味着如果您再次单击“检查器”按钮,则会有两组听众响应鼠标单击按钮一,二和三。

因此,您感兴趣的真正解决方案可能是将上面引用的行留在上面,而是更改以下行:

var t:ButtonListener = new ButtonListener(btnT1, btnT2, btnT3);

如果您更改上面的行以将您的按钮监听器存储为您的类的一部分,它将可用于响应鼠标单击,而不是被垃圾收集:

_buttonListener = new ButtonListener(btnT1, btnT2, btnT3);

当然,假设您已在mx:script块中定义了_buttonListener

<mx:Script><![CDATA[
    var _buttonListener:ButtonListener;
 ]]></mx:Script>

每条评论编辑:

在提供的代码中,t ButtonListener超出了范围。如果是这样,除非您使用强引用,否则它将被垃圾回收,而您的addEventListener调用中的最后一个参数不会使用强引用。

因此,使按钮侦听器成为主类的成员:

Main.mxml 将显示为:

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:Button x="23.5" y="10" label="checker" click="{goListen()}" />
    <mx:Button id="btnT1" x="252.5" y="10" label="t1" />
    <mx:Button id="btnT2" x="309" y="10" label="t2"/>
    <mx:Button id="btnT3" x="366" y="10" label="t3"/>
    <mx:Script>
        <![CDATA[
            private var _buttonListener:ButtonListener;

            private function goListen():void
            {                
                _buttonListener = new ButtonListener(btnT1, btnT2, btnT3); 
            }
        ]]>
    </mx:Script>
</mx:Application>

由于事件侦听器将不再超出范围,因此事件侦听器使用的弱引用将按预期工作,在__buttonListener超出范围时进行垃圾回收。