FLEX3, Нажатие и отслеживание событий, особый случай - PullRequest
0 голосов
/ 28 октября 2008

Вот моя проблема:

У меня есть основная холстная доска на доске, у этого холста есть несколько дочерних элементов, таких как панель инструментов (плитки), метка и немного скинов.

Проблема в том, что когда я перехожу к инструменту прямоугольника и начинаю рисовать прямоугольники, если я хочу изменить инструмент, когда я нажимаю на другой инструмент, такой как «круг» или «выбрать», кнопка не будет ловить щелчок событие, intead холст поймает мышь и начнет рисовать.

Так же, как на картинке. Так что я не могу изменить инструмент, как только я начинаю рисовать.

альтернативный текст http://www.freeimagehosting.net/uploads/397a7cd49e.png

Как я могу не заставить холст реагировать, когда он находится на инструменте, или как сделать так, чтобы кнопка сначала ловила щелчок и говорила холсту "нет" рисовать что-либо.

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

Я открыт для любых предложений.

=== Вот некоторый код, чтобы показать, как он работает внутри. ===

<?xml version="1.0" encoding="utf-8"?>
<mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml" 
          xmlns:degrafa="http://www.degrafa.com/2007"
          xmlns:comp="org.foo.bar.view.components.*"
          layout="absolute"
          title="Tableau">


    <mx:Script>
    <![CDATA[
        import org.edorado.edoboard.ApplicationFacade;
    ]]>
    </mx:Script>

    <mx:Canvas id="blackBoard">

        <degrafa:Surface id="boardSurfaceContainer">
             skinning      
     </degrafa:Surface>

        <!-- Tool bar -->
        <comp:ToolbarView 
           id = "toolbar"
           name = "toolbar"
           verticalScrollPolicy="off" 
           horizontalScrollPolicy="off"
           bottom="5"
           right="5"
           top="5"
           direction="vertical"
           width="30" />   

        <mx:Label x="10" y="10" text="Label"  color="#FFFFFF" id="lbl"/>

    </mx:Canvas>

</mx:Panel>

Панель инструментов представляет собой список кнопок, содержащихся в плитке. «Холстовая доска» связана с обработкой нескольких событий, в частности с помощью мыши вверх и вниз для перемещения фигур.

...
boardCanvas.addEventListener(MouseEvent.MOUSE_DOWN, handleMouseDown);
            boardCanvas.addEventListener(MouseEvent.MOUSE_UP, handleMouseUp);
...
        private function handleMouseDown(event:MouseEvent):void {
            // Get the current mouse location wich may be adjusted to the grid
            var selectPoint:Point = boardCanvas.globalToLocal(new Point(event.stageX, event.stageY));
            startPoint = snapPoint(selectPoint.x, selectPoint.y);
            boardView.lbl.text = '(' + startPoint.x +',' + startPoint.y + ')';
....

Панель инструментов также прослушивает щелчки

<?xml version="1.0" encoding="utf-8"?>
<mx:Tile xmlns:mx="http://www.adobe.com/2006/mxml">

    <mx:Script>
        <![CDATA[
            import mx.charts.BubbleChart;
            import org.edorado.edoboard.view.components.shapes.*; 

            public static const TOOL_CHANGE:String  = "toolChange";
            public static const TEXT_TOOL:String  = "textTool";
            public static const SELECT_TOOL:String  = "selectTool";
            public static const RECTANGLE_TOOL:String  = "rectangleTool";

            private var b:Button = null;

            private function handleButtonClick(event:MouseEvent):void {
                trace("CLICKED  TOOL");
                // selectButton.dispatchEvent(new Event(TOOL_CHANGE, true, true)) 
                b = event.target as Button;
                b.dispatchEvent(new Event(TOOL_CHANGE, true, true));
            }


        ]]>
    </mx:Script>

          <!-- Use class facotry ? -->
          <mx:Button id="selectButton"
                     name="{SELECT_TOOL}"
                     selectedUpSkin="assets.skins.ToolButtonSkin"
                     width="30" 
                     height="30" 
                     styleName="selectButton" 
                     toolTip="selection" 
                     click="handleButtonClick(event); " />

          <mx:Button id="textButton"
                     name = "{TEXT_TOOL}"
                     selectedUpSkin="assets.skins.ToolButtonSkin"
                     width="30" 
                     height="30" 
                     styleName="textButton"  
                     toolTip="text"
                     click="handleButtonClick(event);" />

          <mx:Button id="rectButton" 
                     name = "{RECTANGLE_TOOL}"
                     selectedUpSkin="assets.skins.ToolButtonSkin"
                     width="30"
                     height="30"
                     styleName="rectButton"
                     toolTip="rectButton"
                     click="handleButtonClick(event);" />
</mx:Tile>

Ответы [ 2 ]

1 голос
/ 28 октября 2008

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

1 голос
/ 28 октября 2008

Вы можете использовать свойство target вашего MouseEvent , чтобы отличить комплемент, когда клик идет от вашей панели инструментов. Просто возьмите добычу в LiveDocs, чтобы понять, что является целевым свойством.

Удачи!

...