Как лучше всего заставить кнопку Flex 3 реагировать на клавишу ввода? - PullRequest
9 голосов
/ 20 января 2009

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

Существует ли простой способ заставить кнопки Flex 3 с фокусом вызывать обработчик щелчков, когда пользователь нажимает клавишу ввода?

Ответы [ 7 ]

8 голосов
/ 20 января 2009

Конечно, вы можете сделать что-то вроде этого:

<mx:Script>
    <![CDATA[
        import mx.controls.Alert;

        private function btn_click(event:MouseEvent):void
        {
            Alert.show("Clicked!"); 
        }

        private function btn_keyDown(event:KeyboardEvent):void
        {
            if (event.keyCode == Keyboard.ENTER)
                btn.dispatchEvent(new MouseEvent(MouseEvent.CLICK));
        }
    ]]>
</mx:Script>

<mx:Button id="btn" label="Click Me" click="btn_click(event)" keyDown="btn_keyDown(event)" />

... хотя я не большой поклонник отправки событий на объекты за пределами этих объектов. Более чистый подход может заключаться в создании подкласса Button, добавлении слушателей и обработчиков в ваш подкласс, а затем отправке события click из этого класса. Но это должно помочь проиллюстрировать это. Удачи!

3 голосов
/ 17 августа 2009

Если вы отправляете форму, такую ​​как диалог входа в систему или подобное, свойство «enter» в TextField является отличным решением:

<mx:TextInput displayAsPassword="true" id="wPassword" enter="handleLoginSubmit()"/>

3 голосов
/ 20 января 2009

Для чего-то вроде формы входа в систему вам нужно использовать форму mx: - вот фрагмент кода, который иллюстрирует это:

<mx:Form defaultButton="{loadButton}">
<mx:TextInput id="feedURL" />
<mx:Button id="loadButton" label="Load" click="someHandler(event)" />
</mx:Form>

Введите URL и нажмите Enter, БАМ, ожидаемое поведение.

Погуглил с здесь.

1 голос
/ 24 августа 2011

Вы также можете добавить слушателя KEY_DOWN в ответе Кристиана на саму кнопку. Просто убедитесь, что вы вызываете stopImmediatePropagation. В этом примере я позволил любой клавише вызвать действие кнопки. И я использую тот же обработчик, поэтому разрешаю любой тип «Событие». Вы можете использовать разные обработчики «cancelClick».

protected function cancelClick(e:Event = null):void{
    this.dispatchEvent(new Event(Event.CANCEL)); // do component action
    e.stopImmediatePropagation();
}

override protected function partAdded(partName:String, instance:Object):void {
    super.partAdded(partName,instance);
    switch(instance){
        case cancel:
            cancel.addEventListener(MouseEvent.CLICK,cancelClick);
            cancel.addEventListener(KeyboardEvent.KEY_DOWN,cancelClick);
    }
}
1 голос
/ 24 июня 2009

Еще лучше

    private function setValidationFocus(formObject:Object):void
    {
        formObject.setFocus();
        formObject.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_OUT));  // sneaky sneaky
        formObject.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_OVER));
    }
0 голосов
/ 08 марта 2010

Я смотрю на ту же проблему, но ответ от Кристиана Нунциато кажется мне лучшим. Еще одна вещь, которую нужно добавить к его решению, я думаю, что флаг всплывающего окна btn.dispatchEvent(new MouseEvent(MouseEvent.CLICK)) должен быть установлен на false (btn.dispatchEvent(new MouseEvent(MouseEvent.CLICK, false))), потому что событие должно быть изолировано на кнопке.

0 голосов
/ 20 января 2009

Попробуйте событие "buttonDown"; он может быть отправлен в любом случае. В противном случае вы, вероятно, смотрите на использование «keyDown» и проверяете нажатую клавишу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...