2009-06-11 5 views
3

내가 막으려 고하는 동작은 사용자가 단추를 클릭하고 단추가 포커스를 유지 한 다음 사용자가 스페이스 키를 누르면 다시 발생합니다. 그래서 나는 다른 곳으로 포커스를 설정하거나 버튼이 스페이스 키를 무시하도록함으로써 해결할 수 있다고 생각했습니다. 단추에 다음 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; 

하지만 그 중 하나가 작동하지 않았다. 내부 핸들러에

답변

4

사용자 지정 단추 구성 요소를 만들고 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); 
     } 

    } 
} 

이의 장점은 입력과 같은 다른 키는 여전히 작동, 또는 말, 당신의 색상을 변경하고 싶었 경우 다른 키에 대한 더 많은 조건문을 추가 할 수 있다는 것입니다 버튼을 누르거나 C 버튼을 누르면됩니다.

우리가 여기있는 동안에는 KeyboardEvent.keyCode와 charCode 사이에 차이가 있습니다. keyCode는 실제 키보드의 키 ID입니다. 즉 소문자 c와 대문자 C는 동일합니다 (keyCode == 67). 반면에 charCode는 ASCII 테이블의 문자 주소이므로 c와 C는 다릅니다 (C는 67이고 c는 99 임). keyCode는 대소 문자를 구별합니다.

아, 네. Backspace와 같은 임의의 키를 포함하여 키의 키 및 문자 코드를 확인해야 할 경우 Adobe에서 만든 좋은 사람들 page을 확인하십시오.

나는 이것을 설명하기 위해 application도 만들었습니다. 표준 Flex Builder 프로젝트이지만 소스가 없으면 src 폴더에 있습니다. 응용 프로그램을 실행하고 버튼을 클릭하여 초점을 맞 춥니 다. 버튼의 클릭 이벤트에 따라 버튼 위에 일부 텍스트가 표시되어야합니다. 포커스가있는 동안 스페이스 바를 누르면 클릭 이벤트가 발생하고 더 많은 텍스트를 인쇄해야하지만 아무 일도 일어나지 않습니다! 이제 c 키를 눌러 응용 프로그램의 배경색을 변경하십시오. 알았지?

소스 here을 찾을 수 있습니다.

1

를 추가해보십시오 event.stopPropogation()는

0

"만일"클릭 처리기 버튼 태그에 바인딩 어떤의 keyup 처리기 전에 해고, 그래서 그것을 취소 할 방법이 없습니다. 원하는 것을 할 수있는 한 가지 방법은 이벤트가 스페이스 버튼을 눌러 발생했는지 여부 또는 클릭에서 발생했는지 여부를 플래그로 설정하는 것입니다.

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

공간 버튼을 너무 간단하게 빈 몸을 무시하고이 문제를 해결할 수 있습니다, 버튼의 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 
    { 
    } 

} 
} 
7

나는 동일한 문제가 있었지만 사용자 지정 단추 클래스 또는 가변 배구를 포함하지 않는 더 나은 솔루션을 발견했습니다.

단추가 탭 순서의 일부가 아니더라도 "focusEnabled"속성을 FALSE로 설정하면 스페이스 바 (및 단추 입력)가 단추의 클릭 이벤트를 발생시키는 것을 막을 수 있습니다.

관련 문제