как заставить кнопку не стрелять по клавише 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;
Но и это не сработало.
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 кнопки.
Обработчик щелчка запускается до того, как все обработчики 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