Можно манипулировать элементами пользовательского интерфейса через dispatchEvent ()? - PullRequest
0 голосов
/ 13 мая 2010

Я пытаюсь вручную отправлять события в текстовое поле, чтобы я мог косвенно манипулировать им с помощью кода (например, поместить курсор в заданный набор координат 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 и воспроизведения их через пять секунд в TextField tf2. Когда событие отправляется на 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, как мы ожидаем. Фактически, курсор остается в tf даже после отправки событий tf2.

Пожалуйста, помогите!

Спасибо, -Rich

1 Ответ

1 голос
/ 14 мая 2010

Ты как бы возвращаешься назад. Когда вы нажимаете на объект, и он отправляет MouseEvent, он в основном говорит миру «эй, на меня нажали». Событие является следствием клика. Простая отправка события на объекте на самом деле не вызывает щелчка по объекту (хотя, если другие объекты прослушивают события на объекте, отправка события заставит их думать , что объект был нажат, независимо от того, был ли на самом деле нажат или нет).

Я не совсем уверен, для чего вы здесь, если только это не эксперимент, но я думаю, что вместо того, чтобы просто отправлять событие на tf2, вы хотите интерпретировать то, что произошло бы внутри tf2, как результат этого события, а затем сделать это программно.

Так что, если вы просматриваете свой массив сохраненных событий из tf1, и вы видите CLICK, и вы знаете, что нажатие на tf2 даст ему фокус, вы захотите программно сфокусировать tf2.

Edit:

Перечитывая исходное сообщение, я вижу, вы сказали, что пытаетесь установить курсор на определенную координату x, y. Я думаю, что вы можете взглянуть на TextField.getLineIndexAtPoint (), TextField.getCharIndexAtPoint () и TextField.setSelection ()

...