Проблемы с событием (не обнаружено) - PullRequest
0 голосов
/ 17 октября 2011

Я довольно новичок в Flex и ActionScript и пытаюсь создать приложение, цель которого - просто иметь возможность динамически создавать прямоугольники на панели: при нажатии мыши прямоугольник создается и обновляется при событиях перемещения мыши (удерживая левую кнопку), тогда прямоугольник достигается с помощью мыши вверх.

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                       xmlns:s="library://ns.adobe.com/flex/spark" 
                       xmlns:mx="library://ns.adobe.com/flex/mx"
                       width="550" height="400"
                       creationComplete="this.onCreationComplete(event);">

    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>

    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            import mx.controls.Alert;
            import mx.events.FlexEvent;
            import mx.graphics.SolidColor;

            import spark.primitives.Graphic;
            import spark.primitives.Rect;

            public static const WIDTH:int = 480;
            public static const HEIGHT:int = 300;
            public static const BACKGROUND:int = 0xEFEFEF;
            public static const CURRENT_FILL:SolidColor = new SolidColor(0x00AA00, 0.75);

            protected var rectangles:ArrayCollection = null;

            protected var currentRect:Rect = null;
            protected var dragging:Boolean = false;

            protected function onCreationComplete(event:FlexEvent):void
            {

                this.rectangles = new ArrayCollection();

                this.sprite.graphics.beginFill(BACKGROUND);
                this.sprite.graphics.drawRect(0, 0, this.sprite.width, this.sprite.height);
                this.sprite.graphics.endFill();

                this.sprite.addEventListener(MouseEvent.MOUSE_DOWN, this.onMouseDown);
                this.sprite.addEventListener(MouseEvent.MOUSE_UP, this.onMouseUp);

            }

            protected function onMouseDown(event:MouseEvent):void
            {

                this.currentRect = new Rect();
                this.currentRect.y = 10;
                this.currentRect.height = this.sprite.height - (10 * 2);

                this.currentRect.x = event.localX;
                this.currentRect.width = 1;

                this.panel.addElement(this.currentRect);

                this.dragging = true;

                this.sprite.addEventListener(MouseEvent.MOUSE_MOVE, this.onMouseMove);

            }

            protected function onMouseUp(event:MouseEvent):void
            {
                if (this.dragging)
                {

                    this.sprite.removeEventListener(MouseEvent.MOUSE_MOVE, this.onMouseMove);


                    this.rectangles.addItem(this.currentRect);
                    this.dragging = false;

                }   
            }

            protected function onMouseMove(event:MouseEvent):void
            {
                if (this.dragging)
                {
                    this.currentRect.width = event.localX - this.currentRect.x;     
                }
            }

        ]]>
    </fx:Script>

    <s:Panel id="panel" x="10" y="10" title="Calendar">
        <s:SpriteVisualElement id="sprite" width="{WIDTH}" height="{HEIGHT}" />
    </s:Panel>

</s:WindowedApplication>

Все работает нормально, но теперь я хочу сделать некоторые действия, когда пользователь нажимает (или дважды щелкает, или то, что вы хотите) на прямоугольнике. Я пытался добавить событие в каждый прямоугольник (this.currentRect.addEventListener (MouseEvent.DOUBLE_CLICK, myMethod), добавленный в onMouseUp), но соответствующий метод никогда не выполняется ...

В чем проблема?

Ответы [ 2 ]

0 голосов
/ 18 октября 2011

Вы можете отслеживать прямоугольники, которые вы нарисовали в коллекции, и выполнять проверку попадания прямоугольников при щелчках мыши и определять, нажимается ли какой-либо прямоугольник.

0 голосов
/ 17 октября 2011

Объекты, нарисованные с помощью графического API, не являются диспетчерами событий. Поэтому используйте addElement, чтобы добавить примитивы Spark, которые вы создаете, но никак не используете (в контейнер, такой как группа), вместо того, чтобы использовать графический API для рисования фигур.

Однако может оказаться, что лучше, если ArrayCollection содержит набор связываемых объектов данных и использует DataGroup с itemRenderers для отображения данных.

...