0

テキストフィールドにイベントを手動でディスパッチしようとしているので、コードを介して間接的に操作できます(たとえば、特定のx / y座標のセットにカーソルを置きます)。しかし、私のイベントは効果がないようです。

この現象を実験するためのテストを作成しました。

package sandbox {
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.text.TextFieldType;
import flash.text.TextFieldAutoSize;
import flash.utils.setTimeout;



    public class Test extends Sprite {
        private var tf:TextField;
        private var tf2:TextField;

        public function Test() {
            super();

            tf = new TextField();
            tf.text = 'Interact here';
            tf.type = TextFieldType.INPUT;
            addChild(tf);

            tf2 = new TextField();
            tf2.text = 'Same events replayed with five second delay here';
            tf2.autoSize = TextFieldAutoSize.LEFT;
            tf2.type = TextFieldType.INPUT;
            tf2.y = 30;
            addChild(tf2);

            tf.addEventListener(MouseEvent.CLICK, mouseListener);
            tf.addEventListener(MouseEvent.DOUBLE_CLICK, mouseListener);
            tf.addEventListener(MouseEvent.MOUSE_DOWN, mouseListener);
            tf.addEventListener(MouseEvent.MOUSE_MOVE, mouseListener);
            tf.addEventListener(MouseEvent.MOUSE_OUT, mouseListener);
            tf.addEventListener(MouseEvent.MOUSE_OVER, mouseListener);
            tf.addEventListener(MouseEvent.MOUSE_UP, mouseListener);
            tf.addEventListener(MouseEvent.MOUSE_WHEEL, mouseListener);
            tf.addEventListener(MouseEvent.ROLL_OUT, mouseListener);
            tf.addEventListener(MouseEvent.ROLL_OVER, mouseListener);
        }


        private function mouseListener(event:MouseEvent):void {
            //trace(event);
            setTimeout(function():void {trace(event); tf2.dispatchEvent(event);}, 5000);
        }
    }
}

基本的に、このテストはsetTimeoutを使用して、TextField tfでイベントを効果的に「記録」し、5秒後にTextFieldtf2でそれらを再生するだけです。イベントがtf2にディスパッチされると、コンソール出力にトレースされます。このプログラムを実行してtfをクリックしたときのコンソール出力は次のとおりです。

[MouseEvent type="mouseMove" bubbles=true cancelable=false eventPhase=3 localX=0 localY=1 stageX=0 stageY=1 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
[MouseEvent type="rollOver" bubbles=false cancelable=false eventPhase=2 localX=0 localY=1 stageX=0 stageY=1 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
[MouseEvent type="mouseOver" bubbles=true cancelable=false eventPhase=3 localX=0 localY=1 stageX=0 stageY=1 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
[MouseEvent type="mouseMove" bubbles=true cancelable=false eventPhase=3 localX=2 localY=1 stageX=2 stageY=1 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
[MouseEvent type="mouseMove" bubbles=true cancelable=false eventPhase=3 localX=2 localY=2 stageX=2 stageY=2 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
[MouseEvent type="mouseMove" bubbles=true cancelable=false eventPhase=3 localX=2 localY=3 stageX=2 stageY=3 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
[MouseEvent type="mouseMove" bubbles=true cancelable=false eventPhase=3 localX=3 localY=3 stageX=3 stageY=3 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
[MouseEvent type="mouseMove" bubbles=true cancelable=false eventPhase=3 localX=5 localY=3 stageX=5 stageY=3 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
[MouseEvent type="mouseMove" bubbles=true cancelable=false eventPhase=3 localX=6 localY=5 stageX=6 stageY=5 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
[MouseEvent type="mouseMove" bubbles=true cancelable=false eventPhase=3 localX=7 localY=5 stageX=7 stageY=5 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
[MouseEvent type="mouseMove" bubbles=true cancelable=false eventPhase=3 localX=9 localY=5 stageX=9 stageY=5 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
[MouseEvent type="mouseMove" bubbles=true cancelable=false eventPhase=3 localX=10 localY=5 stageX=10 stageY=5 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
[MouseEvent type="mouseMove" bubbles=true cancelable=false eventPhase=3 localX=11 localY=5 stageX=11 stageY=5 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
[MouseEvent type="mouseMove" bubbles=true cancelable=false eventPhase=3 localX=12 localY=5 stageX=12 stageY=5 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
[MouseEvent type="mouseDown" bubbles=true cancelable=false eventPhase=3 localX=12 localY=5 stageX=12 stageY=5 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
[MouseEvent type="mouseUp" bubbles=true cancelable=false eventPhase=3 localX=12 localY=5 stageX=12 stageY=5 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
[MouseEvent type="click" bubbles=true cancelable=false eventPhase=3 localX=12 localY=5 stageX=12 stageY=5 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
[MouseEvent type="mouseMove" bubbles=true cancelable=false eventPhase=3 localX=10 localY=4 stageX=10 stageY=4 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
[MouseEvent type="mouseMove" bubbles=true cancelable=false eventPhase=3 localX=9 localY=2 stageX=9 stageY=2 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
[MouseEvent type="mouseMove" bubbles=true cancelable=false eventPhase=3 localX=9 localY=1 stageX=9 stageY=1 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
[MouseEvent type="mouseOut" bubbles=true cancelable=false eventPhase=3 localX=-1 localY=-1 stageX=-1 stageY=-1 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
[MouseEvent type="rollOut" bubbles=false cancelable=false eventPhase=2 localX=-1 localY=-1 stageX=-1 stageY=-1 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]

ご覧のとおり、イベントは正常にキャプチャおよび再生されています。ただし、tf2では変更は発生しません。マウスカーソルはtf2に表示されません。実際、tf2イベントがディスパッチされた後でも、カーソルはtfに留まります。

助けてください!

ありがとう、-リッチ

4

1 に答える 1

1

あなたは一種の後退です。オブジェクトをクリックしてMouseEventをディスパッチすると、基本的に「クリックされた」ということを世界に伝えます。イベントはクリックの結果です。オブジェクトにイベントをディスパッチするだけでは、実際にはオブジェクトがクリックされることはありません(ただし、他のオブジェクトがオブジェクトのイベントをリッスンしている場合、イベントをディスパッチすると、オブジェクトが実際にクリックされたかどうかに関係なく、オブジェクトがクリックされたと見なされます。クリックしたかどうか)。

単なる実験でない限り、ここで何をしようとしているのかはよくわかりませんが、単にtf2にイベントをディスパッチするのではなく、tf2内で何が起こったのかを解釈することをお勧めします。そのイベントをプログラムで実行します。

したがって、tf1から保存されたイベントの配列を調べていて、クリックが表示され、tf2をクリックするとフォーカスが得られることがわかっている場合は、プログラムでtf2にフォーカスを与える必要があります。

編集:

元の投稿を読み直すと、カーソルを特定のx、y座標に設定しようとしているとのことです。TextField.getLineIndexAtPoint()、TextField.getCharIndexAtPoint()、およびTextField.setSelection()を確認することをお勧めします。

于 2010-05-14T03:06:31.590 に答える