Приложение для клавиатуры - лучший способ, чтобы несколько кнопок добавляли буквы к текстовому вводу? Использовать обработчики событий?

Я работаю над приложением и создаю для него компонент «Клавиатура». На клавиатуре 30 клавиш, и создавать обработчик событий для каждой кнопки не имеет практического смысла. Когда кнопка нажата, ее метка должна быть отправлена ​​функции, которая добавляет ее в поле ввода текста.

Должен ли я просто создать «click = SomeFunction (Button.label)» для каждой кнопки или есть лучший / более быстрый / менее ресурсоемкий способ сделать это?


person Seidleroni    schedule 17.08.2009    source источник


Ответы (1)


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

myButton.mxml:

<?xml version="1.0" encoding="utf-8"?>
<mx:Button xmlns:mx="http://www.adobe.com/2006/mxml"
    click="clickKeyHandler( event );">

    <mx:Metadata>

        [Event(name="keyboardClickEvent", type="com.KeyboardEvent")]
    </mx:Metadata>

    <mx:Script>
        <![CDATA[

            import com.KeyboardEvent;

            protected function clickKeyHandler( event:MouseEvent ):void{


                dispatchEvent( new KeyboardEvent( this.label ) );
            }
        ]]>
    </mx:Script>
</mx:Button>

com.KeyboardEvent:

package com
{
    import flash.events.Event;

public class KeyboardEvent extends Event
{

    public static const KEYBOARD_CLICK_EVENT:String = "keyboardClickEvent";

    private var _value:String;

    public function get value():String{

        return _value;

    }
    public function KeyboardEvent( value:String = "" )
    {

        super( KEYBOARD_CLICK_EVENT, true );

        _value = value;
    }


    override public function clone() : Event {
        return new KeyboardEvent( _value );
    }

    }

}

использование в приложении:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
    layout="absolute" creationComplete="initApp();" xmlns:local="*">


    <mx:Script>
        <![CDATA[

            import com.KeyboardEvent;

            private function initApp():void{


                this.addEventListener( KeyboardEvent.KEYBOARD_CLICK_EVENT, keyboardHandler);

            }


            private function keyboardHandler( event:KeyboardEvent ):void{

                trace( event.value );
            }
        ]]>
    </mx:Script>

    <local:myButton label="1" />
    <local:myButton label="2" />
    <local:myButton label="3" />
    <local:myButton label="4" />
</mx:Application>
person Shua    schedule 17.08.2009
comment
Возвращает ли строка новое CompactReportEvent (_value); Предполагается сказать return new keyboardEvent (_value); вместо? - person Seidleroni; 18.08.2009
comment
опп да. извините, я скопировал вставку и пропустил это 1 - person Shua; 18.08.2009
comment
Я просмотрел и исправил пример. - person Shua; 18.08.2009
comment
Когда я пытаюсь его скомпилировать, я получаю сообщение об ошибке в this.addEventListener (KeyboardEvent.KEYBOARD_CLICK_EVENT, keyboardHandler); линия. Ошибка считывает доступ к возможно неопределенному свойству KEYBOARD_CLICK_EVENT через ссылку со статическим типом Class. Любые идеи? Спасибо за помощь, я чувствую, что почти на месте. - person Seidleroni; 18.08.2009
comment
У меня заработало, просто подставил строку с ошибкой: this.addEventListener (KeyboardEvent.KEYBOARD_CLICK_EVENT, keyboardHandler); с помощью: this.addEventListener (keyboardClickEvent, keyboardHandler); И заменил все ссылки на эту константу фактической строкой keyboardClickEvent - person Seidleroni; 18.08.2009
comment
он должен работать с константами, вам просто нужно убедиться, что класс импортирован правильно. В следующий раз я протестирую этот пример в Flex перед тем, как опубликовать его ... га - person Shua; 18.08.2009