как заставить кнопку не стрелять по клавише space, если она имеет фокус?



Поведение, которое я пытаюсь предотвратить, заключается в том, что после того, как пользователь нажимает на кнопку, Кнопка сохраняет фокус, а затем, если пользователь нажимает клавишу пробела, кнопка срабатывает снова. Поэтому я подумал, что это можно решить, либо установив фокус в другом месте, либо заставив кнопку игнорировать клавишу пробела. Я попытался добавить следующий прослушиватель событий 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;


Но и это не сработало.
1240   5  

5 ответов:

Вы захотите создать пользовательский компонент кнопки и переопределить 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 или что-то еще.

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

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

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

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

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

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

Попробуйте добавить событие.stopPropogation() для вашего обработчика внутри " if "

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

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();"/>

Кнопка Space обрабатывается внутри кнопки 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
    {
    }

}
}

Comments

    Ничего не найдено.