タイトルどおりの挙動に出くわした。
以下、再現する環境
メインタイムラインには、ボタンインスタンスとテキストフィールド(Input状態)が配置してあるとする。
ボタンインスタンスのインスタンス名:_btn
import fl.managers.FocusManager;
var focusManager:FocusManager = new FocusManager(this);
_btn.tabEnabled = false;
_btn.tabEnabled = true;
これで、パブリッシュし、Tabキーを押すと、テキストフィールドのカーソルからフォーカスは移動していることがわかるが、ボタンにフォーカスがあたっている状態で、黄色の枠が表示されない。
ちなみに、
var focusManager:FocusManager = new FocusManager(this);
この一文がなければ、黄色の枠は表示される。
黄色枠を表示させたい場合は明示的にfocusRectをtrueにしてあげればOK。
なんか面倒だ。
import fl.managers.FocusManager;
var focusManager:FocusManager = new FocusManager(this);
_btn.tabEnabled = false;
_btn.tabEnabled = true;
//これで_btnがフォーカス時に黄色枠が表示される
_btn.focusRect = true;
Tabキー対応は本気でやると結構面倒なので、いっそ全部無効にしてしまった方がいいかも.
素敵サイトもTabキーでバグること多々あり・・・
//これでひとまず全部無効(多分)
stage.stageFocusRect = false;
ただし個別のオブジェクトでfocusRectをtrueしてる場合は個別対応が必要
以下、InteractiveObject.focusRectプロパティ引用
このオブジェクトがフォーカス矩形を表示するかどうかを指定します。true、false または null の 3 つの値のいずれかを指定できます。true および false の値は、予想されるとおり、フォーカス矩形を表示するかどうかが指定されます。null 値は、このオブジェクトが Stage の stageFocusRect プロパティに従うことを示します。
タイトルが何言ってるかよくわからないと思うので、以下のフレームアクションを参照ください。
前提条件
//メインタイムラインにMovieClipインスタンス(インスタンス名:_mc1)を配置
//_mcの内部は全2フレームで、1フレーム目にフレームアクションstop();を記載
//_mcは内部の1フレーム目にのみ、MovieClipインスタンス(インスタンス名:_mc2)を持つ
//_mcの2フレーム目は何もない状態。
//ステージにMovieClipインスタンス(インスタンス名:_mc1)を配置
//_mcの内部は全2フレームで、1フレーム目にフレームアクションstop();を記載
//_mcは内部の1フレーム目にのみ、MovieClipインスタンス(インスタンス名:_mc2)を持つ
//_mcの2フレーム目は何もない状態。
trace("before _mc1:"+_mc1);
//出力:before _mc:[object Timeline_1]
trace("before _mc1._mc2:"+_mc1._mc2);
//出力:before _mc._btn:[object SimpleButton]
var mc:MovieClip = _mc1._mc2;
mc.buttonMode = true;
trace("before numChildren:"+_mc1.numChildren);
//出力:before numChildren:1
trace("before getChildAt:"+_mc1.getChildAt(_mc1.numChildren-1));
//出力:before getChildAt:[object MovieClip]
//_mcの2フレーム目に移動(_btnがないフレーム)
_mc1.gotoAndStop(2);
//_mcの1フレーム目に移動(_btnがあるフレーム)
_mc1.gotoAndStop(1);
trace("after _mc1:"+_mc1);
//出力:after _mc1:[object Timeline_1]
trace("after _mc1._mc2:"+_mc1._mc2);
//出力:after _mc1._mc2:null
trace("after mc:"+mc);
//出力:after mc:[object MovieClip]
trace("after numChildren:"+_mc1.numChildren);
//出力:after numChildren:1
trace("after getChildAt:"+_mc1.getChildAt(_mc1.numChildren-1));
//出力:after getChildAt:null
//nullでないmcが_mc2と同じと思いきや、そうでもない様子
mc.buttonMode = true;//マウスカーソルにならない
ちなみにこれはFlashPlayer9での書き出しの場合。
FlashPlayer10での書き出しの場合は、上記スクリプトのnullの部分が全部Mcとなる。
・・・が、元のMcを挿しているわけでは無いようで、最後のbuttonModeは適応されない。
だいぶAS3と戯れてきたと思ったはずなのに今始めてしった挙動。。。
Flash-JPに似たような内容の記事がありました。
http://www.flash-jp.com/modules/newbb/viewtopic.php?topic_id=8525&forum=20
ちょっとだけハマってしまったのでメモ。
FlashIDE上でRadioButtonをステージに配置して、プロパティのパラメータからgroupNameを設定。
groupNameからRadioButtonGroupインスタンスを作りたい。
◆前提条件
ステージにラジオボタンを配置
プロパティgroupNameには、hogeという名前を設定
◆失敗例
var radioButtonGroup:RadioButtonGroup = new RadioButtonGroup("hoge");
trace(radioButtonGroup.numRadioButtons) //出力:0 (1と出て欲しい)
◆成功例
var radioButtonGroup:RadioButtonGroup = RadioButtonGroup.getGroup("hoge");
trace(radioButtonGroup.numRadioButtons) //出力:1 (想定どおり)
ステージに配置してあるRadioButtonのグループ名を取得するにはRadioButtonGroup.getGroup(“グループ名”)メソッドを使うってこと。
new RadioButtonGroup(“hoge”);は動的に生成したRadioButtonを紐付けたいときとかに使う、多分。