Flex4 с использованием addElement не показывает элемент правильно - PullRequest
0 голосов
/ 19 августа 2010

Я использую новый Flex4 Spark, но застрял в ужасной проблеме.Позвольте мне сначала немного объяснить ситуацию.У меня есть контейнер mx:Canvas, в котором я делаю addElement() экземпляров одного типа DocumentWindow.Предполагается, что класс окна документа является держателем для представления в соответствии с типом документа.Класс DocumentWindow расширяет TitleWindow.У меня также есть панель задач, которая является mx:Canvas с buttonBar внутри, так что окна должны быть переключаемыми.Таким образом, в двух словах я получил держатель окна и панель задач.

Странная вещь приходит сейчас: когда я помещаю DocumentWindow с типом "doc" (который загружает SWF, созданный SWFTools), окно появляется в окнахдержатель и как задача на панели задач.Но если сначала я открою что-то еще - DocumentWindow с типом аудио или видео, что заставляет DocumentWindow создать иную копию другого вида внутри, окно не появляется на экране, ни кнопка задачи не отображается в taskBar.Я положил trace() на это, и это показывает, что numElements увеличивается, taskBar ButtonBar.dataProvider.length увеличивается, так что вещи есть - просто они остаются невидимыми, пока я не открою DocumentWindow с типом 'doc' ?!Я даже пытался заставить DocumentWindow не загружать вид изнутри, потому что думал, что единственное отличие - это вид ... но тогда даже 'doc', напечатанный DocumentWindow, не показывался.Подсказка может заключаться в том, что creationComplete никогда не вызывается до тех пор, пока не будет добавлено представление doc.Есть идеи, что может быть не так?

Вот след, который я получил от держателя окон (numElements от держателя окон Canvas и ButtonBar.dataProvider.length от taskBar):

1 windows, 1 tasks
    win[0] = (0, 0) - [550, 400], visible=true, alpha=1
1 windows, 1 tasks
    win[0] = (0, 0) - [550, 400], visible=true, alpha=1
1 windows, 1 tasks
    win[0] = (0, 0) - [550, 400], visible=true, alpha=1
1 windows, 1 tasks
    win[0] = (0, 0) - [550, 400], visible=true, alpha=1
1 windows, 1 tasks
    win[0] = (0, 0) - [550, 400], visible=true, alpha=1

PS: я trace() d также размер держателя окна - все нормально, он достаточно большой:))

Вот основной код контейнера:



<s:Group
    xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx"
    xmlns:components="some.package.components.*"

    initialize="init()"
    creationComplete="main()">

    <fx:Script>
    <![CDATA[

        public function openDocument(di:DocumentInfo, id:String = null):TaskInfo {
            var w:DocumentWindow = new DocumentWindow();
            var t:TaskInfo = new TaskInfo(di, w, id);
            w.title = di.label;

            var docInfo:DocumentInfo = mServer.getDocumentInfo(di.type, di.label);
            w.init(docInfo, t);

            windows.addWindow(w);
            taskBar.addTask(t);

            return t;
        }

    ]]>
    </fx:Script>



    <mx:HBox id="bottomButtons" horizontalGap="0"
             left="0" bottom="0">
        <mx:Button id="userListButton" click="toggleUserList()"
                   width="40" height="40"/>
        <mx:Canvas id="handButtons"
            horizontalScrollPolicy="off" verticalScrollPolicy="off"
            width="40" height="40">
            <mx:Button id="raiseHandButton" click="toggleRaiseHand()"
                       visible="false" width="40" height="40"/>
            <mx:Button id="sitDownButton" click="doSitDown()"
                       visible="false" width="40" height="40"/>
        </mx:Canvas>
    </mx:HBox>

    <mx:HDividedBox id="vdivider" left="0" top="0" right="0" bottom="40">
        <components:WindowsView id="windows"/>
        <components:RightPanel id="rightPanel"/>
    </mx:HDividedBox>

    <components:TaskBar id="taskBar"
                        left="{bottomButtons.width}" bottom="0" right="0" height="40"/>

</s:Group>

Вот код класса WindowsView:



<?xml version="1.0" encoding="utf-8"?>
<s:Group
        xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" 
        xmlns:mx="library://ns.adobe.com/flex/mx"

        click="showStuff()"
        width="100%" height="100%">

    <fx:Script>
        <![CDATA[
            import some.package.EClassView;

            import mx.events.FlexEvent;

            private function showStuff():void {
                trace(numChildren + ' windows, ' + EClassView.instance.taskBar.taskButtons.dataProvider.length + ' tasks');
                var w:DocumentWindow;
                for(var i:int = 0; i < numElements; ++i) {
                    w = getElementAt(i) as DocumentWindow;
                    if(w == null) continue;
                    trace("\twin[" + i + "] = (" + w.x + ", " + w.y + ") - [" + w.width + ", " + w.height + "], visible=" + w.visible + ", alpha=" + w.alpha);
                }
            }

            public function addWindow(w:DocumentWindow):void {
                w.addEventListener(FlexEvent.CREATION_COMPLETE, onWindowCreation);
                addElement(w);
            }

            private function onWindowCreation(e:FlexEvent):void {
                var w:DocumentWindow = e.currentTarget as DocumentWindow;
                w.removeEventListener(FlexEvent.CREATION_COMPLETE, onWindowCreation);
                w.center();
            }

        ]]>
    </fx:Script>

    <s:Rect width="100%" height="100%">
        <s:fill>
            <s:SolidColor color="0xeeeeee" alpha="1"/>
        </s:fill>
    </s:Rect>

</s:Group>

Код TaskBar:



<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
           xmlns:s="library://ns.adobe.com/flex/spark" 
           xmlns:mx="library://ns.adobe.com/flex/mx"

           initialize="init()"
           creationComplete="main()">

    <fx:Script>
        <![CDATA[
            import some.package.EClassView;
            import some.package.data.TaskInfo;
            import some.package.events.TaskEvent;
            import some.package.skins.GradientButtonSkin;

            import mx.collections.ArrayCollection;
            import mx.core.IVisualElement;
            import mx.core.IVisualElementContainer;
            import mx.events.ItemClickEvent;

            import spark.components.Button;
            import spark.components.DataGroup;
            import spark.components.Group;
            import spark.events.IndexChangeEvent;
            import spark.skins.spark.ButtonBarSkin;

            private var mTasks:ArrayCollection;

            public function get tasks():ArrayCollection {
                return mTasks;
            }

            private function init():void {
                mTasks = new ArrayCollection([]);
            }

            private function main():void {
                taskButtons.dataProvider = mTasks;
            }

            public function addTask(task:TaskInfo):void {
                task.index = mTasks.length;
                mTasks.addItem(task);
                task.win.addEventListener("minimize", onWinMinimize);
                task.win.addEventListener("maximize", onWinMaximize);
                task.win.addEventListener("restore", onWinRestore);
                taskButtons.selectedIndex = task.index;
            }

            public function removeTaskAt(i:int):void {
                var task:TaskInfo = mTasks[i] as TaskInfo;
                var evt:TaskEvent = new TaskEvent(TaskEvent.CLOSING);
                task.dispatchEvent(evt);
                if(evt.stopped) return;

                mTasks.removeItemAt(i) as TaskInfo;

                EClassView.instance.windows.removeElement(task.win);
                task.win.removeEventListener("minimize", onWinMinimize);
                task.win.removeEventListener("maximize", onWinMaximize);
                task.win.removeEventListener("restore", onWinRestore);
                rebuildTaskIndexes();
            }

            public function getTaskById(tid:String):TaskInfo {
                for each(var t:TaskInfo in mTasks) {
                    if(t.id == tid) return t;
                }
                return null;
            }

            public function set volume(v:Number):void {
                for each(var t:TaskInfo in mTasks) {
                    t.win.view.setVolume(v);
                }
            }

            private function rebuildTaskIndexes():void {
                for(var n:int = 0; n < mTasks.length; ++n)
                    (mTasks[n] as TaskInfo).index = n;
            }

            private function onWinMinimize(e:Event):void {
                var win:DocumentWindow = e.currentTarget as DocumentWindow;
                win.visible = false;

                var desktop:IVisualElementContainer = win.parent as IVisualElementContainer;
                var nw:DocumentWindow;
                taskButtons.selectedIndex = mTasks.length - 1;
            }

            private function onWinMaximize(e:Event):void {
                var win:DocumentWindow = e.currentTarget as DocumentWindow;
                win.bring2front();

                win.resizable = win.movable = false;
                win.maximized = true;

                var ws:WindowsView = EClassView.instance.windows;
                win.width = ws.width;
                win.height = ws.height;
            }

            private function onWinRestore(e:Event):void {
                var win:DocumentWindow = e.currentTarget as DocumentWindow;
                win.doRestore();
            }

            private function onTaskChanged(e:MouseEvent):void {
                var newt:TaskInfo = mTasks[taskButtons.selectedIndex] as TaskInfo;
                newt.win.doRestore();
            }

        ]]>
    </fx:Script>

    <s:ButtonBar id="taskButtons" requireSelection="true" styleName="taskbar"
                labelField="title" click="onTaskChanged(event)"
                x="0" width="{width - taskButtons.x}" height="100%"/>

</s:Group>


И на самом деле creationComplete из DocumentWindow никогда не отправляется!Я предполагаю, что DocumentView тип 'doc' создает какое-то событие, которое отсутствует в других представлениях ... Но представления слишком сложны, чтобы публиковать их здесь ... это будет ОГРОМНОЕ сообщение:)

1 Ответ

0 голосов
/ 19 августа 2010

Покажите нам некоторый код, желательно работающий пример. Но, похоже, вы смешиваете компоненты MX / Halo с компонентами Spark. В компонентах Halo, таких как ваш холст, вы должны использовать addChild, а не addElement.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...