Actionscript 3 单选按钮上的空格键和箭头键触发类型错误:错误#1009

Actionscript 3 单选按钮上的空格键和箭头键触发类型错误:错误#1009,actionscript-3,air,Actionscript 3,Air,我刚刚在我的应用程序中发现了一个bug,它看起来像一个Flash播放器bug,我想知道是否有人找到了解决方法或其他什么 我的应用程序中有一些单选按钮组。如果在按住空格键的同时按下箭头键,它最终会触发 TypeError: Error #1009: Cannot access a property or method of a null object reference. at fl.controls::LabelButton/drawIcon() at fl.controls

我刚刚在我的应用程序中发现了一个bug,它看起来像一个Flash播放器bug,我想知道是否有人找到了解决方法或其他什么

我的应用程序中有一些单选按钮组。如果在按住空格键的同时按下箭头键,它最终会触发

  TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at fl.controls::LabelButton/drawIcon()
    at fl.controls::LabelButton/draw()
    at fl.controls::RadioButton/draw()
    at fl.core::UIComponent/callLaterDispatcher()
如果被发现,那就说明了我的处境。
你认为有什么解决办法吗?它真的是一个flash bug吗?

实际上它不是一个flash bug,而是组件的bug。如果空格键不需要你的单选按钮(我认为它没用),你可以通过创建你自己的MyRadioButton来禁用它,它扩展了RadioButton类,这将是禁用空格键输入

package  {
import flash.events.KeyboardEvent;
import fl.controls.RadioButton;
import flash.ui.Keyboard;

public class MyRadioButton extends RadioButton{

    public function MyRadioButton() {
        super();
    }

    override protected function keyUpHandler(event:KeyboardEvent):void {
        if(event.keyCode != Keyboard.SPACE){
            super.keyUpHandler(event);
        }
    }

    override protected function keyDownHandler(event:KeyboardEvent):void {
        if(event.keyCode != Keyboard.SPACE){
            super.keyDownHandler(event);
        }
    }

}
}

只需将类库元素“RadioButton”中的类属性fl.controls.RadioButton更改为MyRadioButton即可。(我假设MyRadioButton在佛罗里达州附近)

------>编辑

这是另一个不禁用空格键的解决方案。这一次,当用户在spacebar keyup之前进行anykeydown时,代码在anykeydown之前运行spacebar keyup。并且焦点从单选按钮上移除,你们也可以添加任何其他的解决方案,比如,若空格键状态关闭,不要让任何键关闭

package  {
import flash.events.KeyboardEvent;
import fl.controls.RadioButton;
import flash.ui.Keyboard;
import flash.events.Event;

public class MyRadioButton extends RadioButton{

private var _isSpaceDown:Boolean = false;

    public function MyRadioButton() {
        super();
    }

    override protected function handleChange(event:Event):void {
        if (_isSpaceDown) {
            keyUpHandler(new KeyboardEvent(KeyboardEvent.KEY_UP, true, true, 0, Keyboard.SPACE));
            setMouseState('up');
        }
        super.handleChange(event);
    }


    override protected function keyUpHandler(event:KeyboardEvent):void {
        if(event.keyCode == Keyboard.SPACE){
            if(_isSpaceDown){
                _isSpaceDown = false;
            }else{
                return;  
            }
        }           
        super.keyUpHandler(event);
    }

    override protected function keyDownHandler(event:KeyboardEvent):void {
        if(event.keyCode == Keyboard.SPACE){
            _isSpaceDown = true;                
        }else{
            if(_isSpaceDown){                   
                var e:KeyboardEvent = new KeyboardEvent(KeyboardEvent.KEY_DOWN);
                e.keyCode = Keyboard.SPACE;
                super.keyUpHandler(e);
                _isSpaceDown = false;
            }
        }           
        super.keyDownHandler(event);
    }

}   

}

事实上,它不是一个flash bug,而是组件的bug。如果空格键不需要你的单选按钮(我认为它没用),你可以通过创建你自己的MyRadioButton来禁用它,它扩展了RadioButton类,这将是禁用空格键输入

package  {
import flash.events.KeyboardEvent;
import fl.controls.RadioButton;
import flash.ui.Keyboard;

public class MyRadioButton extends RadioButton{

    public function MyRadioButton() {
        super();
    }

    override protected function keyUpHandler(event:KeyboardEvent):void {
        if(event.keyCode != Keyboard.SPACE){
            super.keyUpHandler(event);
        }
    }

    override protected function keyDownHandler(event:KeyboardEvent):void {
        if(event.keyCode != Keyboard.SPACE){
            super.keyDownHandler(event);
        }
    }

}
}

只需将类库元素“RadioButton”中的类属性fl.controls.RadioButton更改为MyRadioButton即可。(我假设MyRadioButton在佛罗里达州附近)

------>编辑

这是另一个不禁用空格键的解决方案。这一次,当用户在spacebar keyup之前进行anykeydown时,代码在anykeydown之前运行spacebar keyup。并且焦点从单选按钮上移除,你们也可以添加任何其他的解决方案,比如,若空格键状态关闭,不要让任何键关闭

package  {
import flash.events.KeyboardEvent;
import fl.controls.RadioButton;
import flash.ui.Keyboard;
import flash.events.Event;

public class MyRadioButton extends RadioButton{

private var _isSpaceDown:Boolean = false;

    public function MyRadioButton() {
        super();
    }

    override protected function handleChange(event:Event):void {
        if (_isSpaceDown) {
            keyUpHandler(new KeyboardEvent(KeyboardEvent.KEY_UP, true, true, 0, Keyboard.SPACE));
            setMouseState('up');
        }
        super.handleChange(event);
    }


    override protected function keyUpHandler(event:KeyboardEvent):void {
        if(event.keyCode == Keyboard.SPACE){
            if(_isSpaceDown){
                _isSpaceDown = false;
            }else{
                return;  
            }
        }           
        super.keyUpHandler(event);
    }

    override protected function keyDownHandler(event:KeyboardEvent):void {
        if(event.keyCode == Keyboard.SPACE){
            _isSpaceDown = true;                
        }else{
            if(_isSpaceDown){                   
                var e:KeyboardEvent = new KeyboardEvent(KeyboardEvent.KEY_DOWN);
                e.keyCode = Keyboard.SPACE;
                super.keyUpHandler(e);
                _isSpaceDown = false;
            }
        }           
        super.keyDownHandler(event);
    }

}   

}因此,我调查了这个问题,发现标准fl组件中存在错误。这不仅仅是关于RadioButton。如果您按住空格键,然后通过单击“TAB”按钮切换当前UI元素,您将收到类似的错误

要解决这个问题,您应该修复组件的源代码:在类
LabelButton
中,方法
keyupdhandler
替换代码

setMouseState(oldMouseState);

并添加覆盖:

override protected function focusOutHandler(event:FocusEvent):void {
    if (oldMouseState) {
        keyUpHandler(new KeyboardEvent(KeyboardEvent.KEY_UP, true, true, 0, Keyboard.SPACE));
    }

    super.focusOutHandler(event);
}
如果你不知道,你可以怎么做:

  • 只需将
    Adobe Flash CS5安装文件夹\Common\Configuration\Component Source\ActionScript 3.0\User Interface\fl\controls\LabelButton.as
    复制到另一个具有相同包结构的目录
    \fl\controls\LabelButton.as

  • 然后您需要将这个复制的结构包含到项目中


  • 这不是一个很好的方法,但在这种情况下,它确实修复了这个错误。顺便说一句,我会把它发送到Adobe。

    所以,我调查了这个问题,发现标准fl组件中有一个错误。这不仅仅是关于RadioButton。如果您按住空格键,然后通过单击“TAB”按钮切换当前UI元素,您将收到类似的错误

    要解决这个问题,您应该修复组件的源代码:在类
    LabelButton
    中,方法
    keyupdhandler
    替换代码

    setMouseState(oldMouseState);
    

    并添加覆盖:

    override protected function focusOutHandler(event:FocusEvent):void {
        if (oldMouseState) {
            keyUpHandler(new KeyboardEvent(KeyboardEvent.KEY_UP, true, true, 0, Keyboard.SPACE));
        }
    
        super.focusOutHandler(event);
    }
    
    如果你不知道,你可以怎么做:

  • 只需将
    Adobe Flash CS5安装文件夹\Common\Configuration\Component Source\ActionScript 3.0\User Interface\fl\controls\LabelButton.as
    复制到另一个具有相同包结构的目录
    \fl\controls\LabelButton.as

  • 然后您需要将这个复制的结构包含到项目中


  • 这不是一个很好的方法,但在这种情况下,它确实修复了这个错误。顺便说一句,我会将其发送到Adobe。

    抱歉,这不是一个好的解决方案-keybord在UI中可能非常有用,我们必须避免切断此功能。当然,但我认为空格键是无用的(不是键盘:))我不能作为RadioButton上的用户使用它。我检查了你的解决方案,但我不认为问题在于修复只是修复了错误,而不是修复了可用性。如果你想使用空格键,我正在添加另一个解决方案。我现在已经添加了完整修复的解决方案。使用按钮和单选按钮组合进行检查。是的,问题已经够深了,但可以解决,只需要测试。再说一遍,这不仅仅是RadioButton的问题。顺便说一句,如果你在我的解决方案中发现错误,请告诉我。谢谢,我考过了。它的focusout在可用性方面有一个小缺陷,这不是什么大问题,但我建议使用override Handle Change not focusout我也覆盖了我的,因为它在用空格键单击单选按钮进行响应时出现了问题。我也不喜欢这个覆盖focusOut,但是handleChange-是RadioButton的方法,所以它不足以修复按钮等等。对不起,这不是一个好的解决方案-keybord在UI中可能非常有用,我们必须避免切断这个功能。当然,但我认为空格键是无用的(不是键盘:))我不能作为RadioButton上的用户使用它。我检查了你的解决方案,但我不认为问题在于修复只是修复了错误,而不是修复了可用性。如果你想使用空格键,我正在添加另一个解决方案。我现在已经添加了完整修复的解决方案。使用按钮和单选按钮组合进行检查。是的,问题已经够深了,但可以解决,只需要测试。再说一遍,这不仅仅是RadioButton的问题。顺便说一句,如果你在我的解决方案中发现错误,请告诉我。谢谢,我考过了。它的focusout在可用性方面有一个小缺陷,这不是什么大问题,但我建议使用override Handle Change not focusout我也覆盖了我的,因为它在用空格键单击单选按钮进行响应时出现了问题。我也不喜欢这个override focusOut,但是handleChange-是RadioButton的方法,所以它不足以修复Button等等。我已经实现了您的解决方案,thx:)我只是在等待社区评估其他解决方案,但是