как сделать так, чтобы кнопка не срабатывала при нажатии клавиши пробела, если она имеет фокус? - PullRequest
3 голосов
/ 11 июня 2009

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

private function btn_keyDown(event:KeyboardEvent):void {
  // try to ignore spaces, i.e. don't click on SPACE when it has focus
  if (event.keyCode == Keyboard.SPACE) {
  }
}

Я попытался изменить фокус, выполнив следующее в конце функции, которая вызывается при нажатии кнопки:

stage.focus = parent;

но это тоже не сработало.

Ответы [ 5 ]

7 голосов
/ 07 мая 2010

У меня была та же проблема, но я нашел лучшее решение, не включающее пользовательские классы кнопок или переменный волейбол.

Если вам не важно, что ваша кнопка является частью порядка табуляции, просто установите для свойства focusEnabled значение FALSE, и это не даст пробелу (и кнопке ввода) вызвать событие нажатия кнопки.

4 голосов
/ 12 июня 2009

Вы захотите создать пользовательский компонент кнопки и переопределить keyDownHandler. Но, если вы хотите выбрать кнопку (кнопки), которые нужно остановить, вам нужно добавить условие в код. Вот как это должно выглядеть:

package Sandbox
{
    import mx.controls.Button;
    import flash.events.KeyboardEvent;

    public class KeyButton extends Button
    {
        public function KeyButton()
        {
            super();
        }

        protected override function keyDownHandler(e : KeyboardEvent) : void {
            if (e.keyCode == 32) { // Spacebar
                return;
            }
            else if (e.keyCode == 67) { // Letter C
                this.parentApplication.setStyle ("backgroundColor", "#00aa00");
            }

            super.keyDownHandler (e);
        }

    }
}

Преимущество этого в том, что другие клавиши будут по-прежнему работать, например, Enter, или вы можете добавить дополнительные условные обозначения для разных клавиш, если, скажем, вы хотите изменить цвет кнопки, если вы нажали C или что-то еще.

И пока мы на этом, между KeyboardEvent.keyCode и charCode есть разница. keyCode - это идентификатор клавиши на физической клавиатуре, что означает, что строчные буквы c и заглавная буква C одинаковы (keyCode == 67). charCode, с другой стороны, является адресом символа в таблице ASCII, поэтому c и C различны (C равно 67, а c равно 99). keyCode нечувствителен к регистру, короче.

О да. И если вам нужно проверить ключ и коды символов ключа (включая произвольные, такие как Backspace), посмотрите эту страницу , которую сделали хорошие люди из Adobe.

Я также сделал приложение , чтобы проиллюстрировать это. Это стандартный проект Flex Builder, но его источник находится в папке src, если у вас его нет. Запустите приложение и нажмите кнопку, чтобы сфокусировать его. Некоторый текст должен появиться над кнопкой, благодаря событию нажатия кнопки. Пока он находится в фокусе, нажмите пробел, который должен запустить событие щелчка и напечатать больше текста, но ничего не происходит! Теперь нажмите клавишу c, чтобы изменить цвет фона приложения. Аккуратно, а?

Вы можете найти источник здесь .

1 голос
/ 11 июня 2009

Попробуйте добавить event.stopPropogation () к вашему обработчику внутри "if"

0 голосов
/ 12 июня 2009

Кнопка пробела обрабатывается внутри keyDownHandler кнопки, поэтому просто замените ее пустым телом, и это решит проблему. Как это:

package test
{
import mx.controls.Button;
import flash.events.KeyboardEvent;

public class NoSpaceButton extends Button
{
    public function NoSpaceButton()
    {
        super();
    }

    override protected function keyDownHandler(event:KeyboardEvent):void
    {
    }

}
}
0 голосов
/ 11 июня 2009

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

private var spacePressed:Boolean = false;

private function onKeyDown(event:KeyboardEvent):void {
    if (event.keyCode == Keyboard.SPACE) {
        spacePressed = true;
    }
}

private function onKeyUp(event:KeyboardEvent):void {
    if (event.keyCode == Keyboard.SPACE) {
        spacePressed = false;
    }
}

private function doSomething():void {
    if (spacePressed)
        return;
    // Normal handling...
}

<mx:Button label="Button"
    keyDown="onKeyDown(event);"
    keyUp="onKeyUp(event);"
    click="doSomething();"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...