1

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

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

  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()

如果找到描述我同样情况的这个线程。你认为有什么解决方法吗?它真的是一个闪存错误吗?

4

2 回答 2

5

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

要解决它,您应该修复组件的来源:在类中LabelButton,方法keyUpHandler替换代码

setMouseState(oldMouseState);

if (oldMouseState!==null) {
    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);
}

如果你不知道,你可以怎么做:

  1. 只需复制Adobe Flash CS5 install folder\Common\Configuration\Component Source\ActionScript 3.0\User Interface\fl\controls\LabelButton.as到具有相同包结构的另一个目录\fl\controls\LabelButton.as

  2. 那么您需要将这个重复的结构包含在项目中。

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

于 2012-09-30T15:35:11.163 回答
1

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

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);
        }
    }

}

}

只是您需要将类属性 fl.controls.RadioButton 从您的库元素更改为 MyRadioButton:“RadioButton”。(我假设 MyRadioButton 在 fla 附近)

------>编辑

这是另一种不禁用空格键的解决方案。这一次,当用户在空格键 keyup 代码之前进行 anykeydown 时,在 anykeydown 之前运行空格键 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);
    }

}   

}

于 2012-09-30T14:26:16.887 回答