Apache flex 类中的flex按钮事件侦听器

Apache flex 类中的flex按钮事件侦听器,apache-flex,class,button,event-handling,flexbuilder,Apache Flex,Class,Button,Event Handling,Flexbuilder,我在Main.mxml中有许多按钮。我试图将按钮功能移动到一个类中,让类中的事件侦听器响应单击并调用其他函数。我写过: 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="t

我在Main.mxml中有许多按钮。我试图将按钮功能移动到一个类中,让类中的事件侦听器响应单击并调用其他函数。我写过:

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"/>
package com.util
按钮Listener.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"/>
package com.util
{ 导入flash.events.EventDispatcher; 导入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个事件侦听器和相应的函数

由于按钮气泡的click事件,您可以只监听主应用程序文件上的click事件,并将其委托给类中的处理程序函数

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

private var controller:ButtonListener = new ButtonListener();

<mx:Button id="btnT1" x="252.5" y="10" label="t1" click="controller.handleClick(event)"/>
private-var-controller:ButtonListener=new-ButtonListener();

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

item.addEventListener(MouseEvent.CLICK, traceMe, false, 0, true);
若要
false
,则所有操作都应该有效,因为您的事件侦听器将粘住以处理鼠标单击。当然,这意味着如果你第二次点击“checker”按钮,你将有两组监听器对鼠标点击按钮1、2和3做出响应

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

var t:ButtonListener = new ButtonListener(btnT1, btnT2, btnT3);
如果更改上述行以将按钮侦听器存储为类的一部分,则可以响应鼠标单击,而不是进行垃圾收集:

_buttonListener = new ButtonListener(btnT1, btnT2, btnT3);
当然,这假设您已经在mx:script块中定义了
\u buttonListener

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

由于事件监听器将不再超出范围,事件监听器使用的弱引用将按预期工作,当
\uu buttonListener
超出范围时将被垃圾收集。

Kaleb,您发布的第一个解决方案是有效的,因为我使用checker按钮作为测试来实例化buttonListener类。然而,当应用程序加载时,我将实例化它。我不能垃圾收集事件侦听器,因为我需要在整个电影中播放所有按钮。但是,我不理解您的第二种解决方案。请您详细说明一下好吗?