слушатели события кнопки flex в классе - PullRequest
1 голос
/ 04 августа 2009

У меня много кнопок в 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

{ импорт 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 слушателей событий и соответствующие функции в основном классе.

Ответы [ 2 ]

1 голос
/ 04 августа 2009

Похоже, у вас есть два разных варианта или проблемы. Если вы измените последний параметр в:

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

до false, тогда все должно работать, потому что ваш обработчик событий будет обрабатывать щелчки мыши. Конечно, это означает, что если вы нажмете кнопку «проверки» во второй раз, то у вас будет два набора слушателей, реагирующих на щелчки мышью по кнопкам одна, две и три.

Таким образом, вполне вероятно, что реальное решение, которое вас интересует, это оставить строку, приведенную выше, такой же, и вместо этого изменить следующую строку:

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

Если вы измените вышеприведенную строку, чтобы сохранить слушателя кнопок как часть вашего класса, он будет доступен для реагирования на щелчки мыши, а не для сбора мусора:

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

Это, конечно, предполагает, что вы определили _buttonListener в блоке mx: script:

<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 выходит из области видимости.

1 голос
/ 04 августа 2009

Поскольку событие click пузырьков Button происходит, вы можете просто прослушать событие click в главном файле приложения и делегировать функцию-обработчик в классе.

Или вы можете вызвать обработчик непосредственно по нажатию вашей кнопки.

private var controller:ButtonListener = new ButtonListener();

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