如果有焦点,如何让空格键上的按钮不亮?

时间:2009-06-11 18:15:53

标签: flex

我试图阻止的行为是在用户点击按钮后,按钮保持焦点,然后如果用户点击空格键,则按钮再次触发。所以我认为可以通过将焦点设置在别处,或者通过让按钮忽略空格键来解决。我尝试在按钮上添加以下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 个答案:

答案 0 :(得分:7)

我遇到了同样的问题,但找到了一个更好的解决方案,不涉及自定义按钮类或变量排球。

如果您不关心您的按钮是Tab键顺序的一部分,只需将“focusEnabled”属性设置为FALSE,这将停止空格键(并输入按钮)触发按钮的单击事件。

答案 1 :(得分: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);
        }

    }
}

这样做的好处是,其他按键仍然可以正常工作,例如Enter,或者你可以为不同的按键添加更多条件,例如,如果按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

答案 2 :(得分:1)

尝试将event.stopPropagation()添加到“if”

中的处理程序中

答案 3 :(得分:0)

在绑定到按钮标记的任何键盘处理程序之前触发单击处理程序,因此无法取消它。你可以做你想做的一种方法是设置一个标志,无论事件是由按空格按钮引起的,还是来自点击的结果。

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

答案 4 :(得分:0)

空格按钮在Button的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
    {
    }

}
}