我在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个事件监听器和相应的函数。
答案 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
超出范围时进行垃圾回收。