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 だけの問題ではありません。SpaceBar を押したまま "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. 次に、この複製された構造をプロジェクトに含める必要があります。

あまり良い方法ではありませんが、この場合、このエラーは本当に修正されます。ところで、アドビに送ります。

于 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をライブラリ要素"RadioButton"からMyRadioButtonに変更する必要があります。(MyRadioButtonはflaに近いと思います)

------>編集

スペースバーを無効にしない別の解決策があります。今回は、ユーザーがスペースバーキーアップコードの前にanykeydownを実行すると、anykeydownの前にスペースバーキーアップが実行されます。ラジオボタンからフォーカスが削除されます。また、スペースバーのキー状態が下がっている場合など、他のソリューションを追加して、キーを下ろさないようにすることもできます。

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 に答える