サイトトップ

Director Flash 書籍 業務内容 プロフィール

Macromedia Flash非公式テクニカルノート

コンポーネントに続けてButtonを連続クリックするとイベントが発生しない

ID: FN0510008 Product: Flash

Platform: All
Version: MX 2004 and 8

問題
Flash MX 2004およびFlash 8で確認されました。UI Componentsのコンポーネントインスタンスをクリックしてから、Button(UI ComponentsでなくActionScript定義済みの)インスタンスを連続クリックすると、Buttonインスタンスにマウスクリックのイベントが渡らなくなります。MovieClipインスタンスを使っても、同じ問題が発生します。ComboBoxのほか、TextAreaやTextInputコンポーネントで、この問題が確認されています。以下の本稿では、ComboBoxコンポーネントを例としてご説明します。

ComboBoxの設定は問いません。項目のない空の状態でも、現象は再現します。ComboBoxクリックをして、ButtonまたはMovieClipインスタンスをクリックすると、最初のマウスイベントは発生します。しかし、マウスポインタを動かさずに連続クリックすると、2回目以降のマウスクリックのイベント(onReleaseまたはon (release))がインスタンスに渡されないようです。

図001■ComboBoxをクリックしてからButtonを連続クリックするとボタンイベントが発生しない

*画像をクリックするとテスト用SWF(Flash Player 7対応)が表示されます

インスタンスに設定するスクリプトは、on ()イベントハンドラアクションでもonReleaseonPressなどのイベントハンドラメソッドでも変わりははありません。インスタンスに対するマウスクリックのイベントが、発生しなくなるようです[*1]。

[*1] 発生しなくなるのは、on ()イベントハンドラアクションやonRelease/onPressイベントハンドラメソッドで受取るインスタンスに対するマウスイベントです。したがって、onClipEvent (mouseDown)/onClipEvent (mouseUp)のようなインスタンスを対象としないマウスイベントは発生します。

原因
コンポーネントインスタンスに対するフォーカスを管理するFocusManagerクラスに問題があるようです。

ComboBoxをクリックした後、ButtonやMovieClipをクリックすると、そのインスタンスに一瞬フォーカスが移って、すぐにComboBoxに戻ってしまいます。そのためロールオーバーとロールアウトのイベントが連続して生じるのみで、マウスクリックのイベントが発生しません。UI ComponentsのButtonコンポーネントを使用すれば、フォーカスは正しく移動します。

対処法
ひとつは前述のとおり、UI ComponentsのButtonコンポーネントを使うことが考えられます。コンポーネントインスタンス間のフォーカス移動は、FocusManagerが正しく管理しているからです。

もうひとつの方法として、ActionScript定義済みのButtonやMovieClipインスタンスを用いる場合には、FocusManager.setFocus()メソッドで明示的にフォーカスを移すことが考えられます。フォーカスを確認したい場合には、FocusManager.getFocus()メソッドを用います。

つぎのButtonアクションは、クリックするとfocusManager.setFocus()メソッドで、Buttonインスタンスにフォーカスを移します(スクリプト001)。なお、Buttonインスタンスmy_btnは、メインタイムラインに配置してあるものとします。

スクリプト001■FocusManager.setFocus()でフォーカスを移す

// Button: _root.my_btn
// Buttonアクション
on (release) {
   trace(_root.focusManager.getFocus());
   _root.focusManager.setFocus(_root.my_btn);   // [*2]
}

スクリプト001をButtonアクションに設定して、[ムービープレビュー]を実行し、ComboBoxをクリックしたうえでButtonインスタンスを連続クリックすると、[出力]パネルにはつぎのような結果が表示されます。ComboBoxインスタンスは、_root.my_cbです。

    _level0.my_cb
    _level0.my_btn
    _level0.my_btn
    ...[以下同じ]...

最初ComboBoxインスタンスにあったフォーカスが、FocusManager.setFocus()メソッドによりButtonインスタンスに移動し、連続クリックしてもマウスイベントがButtonに正しく渡ります。ただし、フォーカスが移動すると、インスタンスの周囲に黄色のフォーカス矩形が表示されます(図002)。フォーカス矩形は,マウスポインタを動かせば、表示が消えます。

図002■Buttonインスタンスの周囲に表示されたフォーカス矩形

フォーカス矩形を表示したくないときは、インスタンスのButton._focusrect(MovieClipの場合にはMovieClip._focusrect)プロパティをfalseに設定します。

スクリプト002■Button._focusrectプロパティでフォーカス矩形を非表示にする

// タイムライン: _root
// フレームアクション
my_btn._focusrect = false;


[*2] コンポーネントが[ライブラリ]にあると自動的に、FocusManagerクラスのインスタンスが_rootにfocusManagerという名前で作成されます。ですから、FocusManagerクラスのメソッドを呼出すには、_root.focusManagerをターゲットとして参照します。

なお、FocusManager.setFocus()メソッドの引数となるButtonインスタンスの参照は、ここでは絶対パスで_root.my_btnと指定しています。相対パスで記述する場合、Buttonアクションにおける参照の起点は(thisがあってもなくても)インスタンスの配置されたタイムライン(_root)になりますので、ご注意ください。

_____

作成者: 野中文雄
更新日: 2006年1月10日 ComboBoxから一瞬フォーカスが移ってロールオーバーとロールアウトのイベントが発生していることを追加。
更新日: 2005年10月28日 ComboBox以外にTextAreaやTextInputコンポーネントでも同様の問題が発生することを追加。それにともない、タイトルを「ComboBoxを選んでButtonを連続クリックするとイベントが発生しない」から現行に変更。
作成日: 2005年10月23日


Copyright © 2001-2006 Fumio Nonaka.  All rights reserved.