代码之家  ›  专栏  ›  技术社区  ›  D3vtr0n

错误#2025:提供的DisplayObject必须是调用者的子对象

  •  1
  • D3vtr0n  · 技术社区  · 14 年前

    我对FLEX编程非常陌生。我继承了一个flex4项目,它调用web服务向最终用户显示数据。

    登录过程正常。我有三个标签,第四个标签我现在添加。

    选项卡是使用TabNavigator中的元素创建的。我添加了第四个VBOX,如下所示:

            <mx:VBox label="Data Analysis" width="100%" height="100%">
            <componenets:DeviceLineChart />
        </mx:VBox>
    

    DeviceLineChart.mxml如下所示:

    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
                xmlns:charts="org.axiis.charts.*"
                layout="absolute"
                creationComplete="start();"
                xmlns:axiis="http://www.axiis.org/2009"
                xmlns:series="org.axiis.charts.series.*"
                xmlns:groupings="org.axiis.charts.groupings.*"
                xmlns:degrafa="http://www.degrafa.com/2008"
                xmlns:states="org.axiis.states.*"
                xmlns:paint="org.axiis.paint.*"
                xmlns:Examples="Examples.*"
                xmlns:axis="org.axiis.charts.axis.*"
                xmlns:labels="org.axiis.charts.labels.*"
                xmlns:utils="org.axiis.utils.*" viewSourceURL="srcview/index.html">
    
    <mx:Style source="styles/Axiis_Examples.css"/>
    
    <mx:Script>
        <![CDATA[
            import org.axiis.data.DataSet;
    
            private var ds:DataSet = new DataSet();
    
            public function start():void
            {
                ds.processCsvAsTable(payload, false);
    
                //LineSeriesGroup expects each unique series as a row
                //Since our data has the time entries on each row (a common format for temporal data) we want to pivot the data
                //This then makes a column for each unique time entrie and a row for each unique column.
                ds.pivotTable(0);
                dataProvider = ds.data.pivot.rows;
                hScale.dataProvider=ds.data.pivot.header.slice(1,dataSlice.value+1);
                hAxis.invalidateDataProvider();
                dc.invalidateDisplayList();
            }
    
            private function sliceData():void {
                hScale.dataProvider=ds.data.pivot.header.slice(1,dataSlice.value+1);
                hAxis.invalidateDataProvider();
                myLineGroup.invalidateDataProvider();
                dc.invalidateDisplayList(); 
            }
    
            private function axisLabel(obj:Object):String
            {
                return formatter.format(Number(obj) / 1000);
            }
    
            private function filterColumns(obj:Object):Boolean
            {
                //Don't want filter fields, trim columns
                if (obj.index < 1 || obj.index > dataSlice.value)
                    return false;
                else
                    return true;
            }
    
            private function filterRows(obj:Object):Boolean
            {
                //Trim our rows
                if (obj.pivotName == "Apples")
                    return false;
                else
                    return true;
            }
        ]]>
    </mx:Script>
    
    <mx:String id="payload" source="data/LineSeriesData.csv"/>
    
    <mx:CurrencyFormatter currencySymbol="k"
                          precision="0"
                          id="formatter"
                          alignSymbol="right"
                          useThousandsSeparator="true"/>
    
    <!--  GLOBAL VARIABLES -->
    <mx:Object id="dataProvider"/>
    <mx:String id="verticalField"/>
    <mx:Number id="percentGap">.02</mx:Number>
    
    <!--  EXPRESSIONS -->
    <utils:NumericExpression id="tension" value="{slider.value/210}" valueChanged="{if (myLineGroup) dc.invalidateDisplayList();}"/>
    
    
    <!-- CHART -->
    <axiis:LinearScale id="vScale"
                       dataProvider="{dataProvider}"
                       minLayout="0"
                       maxLayout="{myLineGroup.height}"
                       />
    
    <axiis:CategoricalScale id="hScale"
                            minLayout="0"
                            maxLayout="{myLineGroup.width}"
                            />
    
    <axiis:DataCanvas width="80%"
                      id="dc"
                      top="120"
                      bottom="100"
                      horizontalCenter="0"
                      strokes="{strokes}"
                      fills="{fills}"
                      palettes="{palettes}"
                      showDataTips="true">
    
        <!-- Background -->
        <axiis:backgroundGeometries>
            <axis:VAxis id="vAxis"
                        verticalScale="{vScale}"
                        tickStroke="{axisStroke}"
                        width="{dc.width}"
                        height="{myLineGroup.height}"
                        showDataTips="false"
                        fontFamily="Myriad Pro"
                        fontColor="0"
                        fontSize="14"
                        tickGap="5"
                        majorTickSpacing="50"
                        labelFunction="{axisLabel}"/>
            <axiis:HCategoryAxis id="hAxis"
                                 x="{myLineGroup.x}"
                                 categoryScale="{this.hScale}"
                                 width="{myLineGroup.width}"
                                 dataProvider="{hScale.dataProvider}"
                                 height="50"
                                 y="{myLineGroup.height}"/>
            <degrafa:Line x="0"
                          x1="{myLineGroup.x+myLineGroup.width}"
                          y="{myLineGroup.height}"
                          y1="{myLineGroup.height}"
                          stroke="{axisStroke}"/>
        </axiis:backgroundGeometries>
    
        <!-- Layouts -->
        <axiis:layouts>
            <groupings:LineSeriesGroup id="myLineGroup"
                                       x="12"
                                       y="0"
                                       height="{dc.height-70}"
                                       width="{dc.width}"
                                       tension="{tension.value}"
                                       markerColor="{areaPalette.currentColor}"
                                       dataFilterFunction="{filterRows}"
                                       showArea="{area.selected}"
                                       plotFilterFunction="{filterColumns}"
                                       markerSize="8"
                                       showMarker="{showMarker.selected}"
                                       mode="{int(layoutGroup.selectedValue)}"
                                       dataProvider="{dataProvider}"
                                       plotCollection="columns"
                                       dataField="value"
                                       labelField="pivotName"
                                       xDataField="name"
                                       plotLabelField="name"
                                       verticalScale="{vScale}"
                                       horizontalScale="{hScale}"
                                       stroke="{myStroke}"
                                       fill="{areaFill}"
                                       enableRollOver="true"/>
        </axiis:layouts>
    </axiis:DataCanvas>
    
    <!--  FILLS & STROKES -->
    
    <mx:Array id="palettes">
        <paint:LayoutAutoPalette id="outerPalette" layout="{myLineGroup}" colorFrom="0xCC3333" colorTo="0x3333CC"/>
        <paint:LayoutAutoPalette id="clusterPalette" layout="{myLineGroup}" colorFrom="{outerPalette.currentColor}" colorTo="{outerPalette.currentColor | 0x337f00}"/>
        <paint:LayoutAutoPalette id="areaPalette" layout="{myLineGroup}" colorFrom="0x3333CC" colorTo="0xCC3333"/>
    </mx:Array>
    <mx:Array id="fills">
        <degrafa:LinearGradientFill id="areaFill" angle="90" enableEvents="false">
            <degrafa:GradientStop color="{areaPalette.currentColor}" alpha=".95"/>
            <degrafa:GradientStop color="{areaPalette.currentColor | 0x999933}" alpha=".65"/>
        </degrafa:LinearGradientFill>
        <degrafa:LinearGradientFill id="clusterFill" angle="45" enableEvents="false">
            <degrafa:GradientStop color="{clusterPalette.currentColor}"/>
            <degrafa:GradientStop color="{clusterPalette.currentColor | 0xFFFFFF}" alpha=".85"/>
        </degrafa:LinearGradientFill>
    </mx:Array>
    <mx:Array id="strokes">
        <degrafa:LinearGradientStroke id="colStroke" pixelHinting="true" angle="45" enableEvents="false">
            <degrafa:GradientStop color="0xFFFFFF" alpha=".7"/>
            <degrafa:GradientStop color="0xFFFFFF" alpha=".3"/>
        </degrafa:LinearGradientStroke>
        <degrafa:SolidStroke color="0xFFFFFF" alpha=".3"/>
        <degrafa:SolidStroke color="0x222222" id="axisStroke" pixelHinting="true"/>
        <degrafa:SolidStroke color="{areaPalette.currentColor}"
                             id="myStroke"
                             weight="1"
                             alpha="1"
                             caps="none"
                             pixelHinting="true"/>
    </mx:Array>
    
    <!-- DISPLAY OBJECTS -->
    
    <mx:HBox id="myBox" bottom="50" horizontalCenter="0">
        <mx:HBox>
            <mx:Label text="Line Curve" textAlign="right" verticalCenter="0"/>
            <mx:HSlider width="80"
                        id="slider"
                        minimum="1"
                        maximum="80"
                        value="35"
                        liveDragging="true"
                        showTrackHighlight="false"
                        verticalCenter="-5"/>
        </mx:HBox>
        <mx:Label text="|"/>
        <mx:HBox>
            <mx:Label text="% Data" textAlign="right" verticalCenter="0"/>
            <mx:HSlider width="80"
                        id="dataSlice"
                        minimum="3"
                        maximum="220"
                        value="30"
                        snapInterval="1"
                        change="{sliceData();}"
                        showTrackHighlight="false"
                        verticalCenter="-5"/>
        </mx:HBox>
        <mx:HBox>
            <mx:Label text="Label Rotation" textAlign="right" verticalCenter="0"/>
            <mx:HSlider width="80"
                        id="labelRotate"
                        minimum="0"
                        maximum="90"
                        value="0"
                        snapInterval="1"
                        change="{hAxis.labelRotation=labelRotate.value;dc.invalidateDisplayList();}"
                        showTrackHighlight="false"
                        verticalCenter="-5"/>
        </mx:HBox>
        <mx:Label text="|"/>
        <mx:HBox>
            <mx:Label text="Area" textAlign="right" verticalCenter="0"/>
            <mx:CheckBox id="area" change="{dc.invalidateDisplayList();}" selected="true"/>
        </mx:HBox>
        <mx:Label text="|"/>
        <mx:HBox>
            <mx:Label text="Marker" textAlign="right" verticalCenter="0"/>
            <mx:CheckBox id="showMarker" change="{dc.invalidateDisplayList();}"/>
        </mx:HBox>
        <mx:Label text="|"/>
        <mx:Spacer width="20"/>
        <mx:HBox>
            <mx:RadioButtonGroup id="layoutGroup" change="{dc.invalidateDisplayList();}"/>
            <mx:RadioButton label="Overlay" group="{layoutGroup}" value="{LineSeriesGroup.MODE_BASELINE}" selected="true"/>
            <mx:RadioButton label="Stack" group="{layoutGroup}" value="{LineSeriesGroup.MODE_STACK_ZERO}"/>
            <mx:RadioButton label="Flow" group="{layoutGroup}" value="{LineSeriesGroup.MODE_STACK_FLOW}"/>
        </mx:HBox>
    </mx:HBox></mx:Application>
    

    我实施了一个 Axiis Line Chart 我觉得这很酷。但是我在实现它时遇到了一些问题,因为折线图最初是用Flex3编写的(我的项目是Flex4)。它最终会正确显示(提供了所有数据),但我无法在没有收到错误的情况下单击折线图上的任何内容。

    我想指出的是,这不是一个重复的问题,因为一个类似的问题已经在本报告中得到了回答 here . 我的问题非常相似,只是我的项目已经使用了我所知道的“”名称空间,这在前面的stackoverflow答案中被称为“修复程序”。也许我没有在正确的位置正确地使用名称空间?我不确定,可以张贴更多的我的组件和他们的代码,如果必要的。我可能在这里说希腊语,或者可能会让你们中的一些人感到困惑,但我的FLEX开发生命周期只有6天,所以请原谅我的无知,因为这对我来说是一个全新的领域。

    here

    我当前收到错误:

    ArgumentError:错误#2025:提供的DisplayObject必须是调用者的子对象。 在flash.display::DisplayObjectContainer/getChildIndex() 在mx.managers.systemClasses::ActiveWindowManager/mouseDownHandler()[E:\dev\4.0.0\frameworks\projects\framework\src\mx\managers\systemClasses\ActiveWindowManager.as:471]

    此错误仅发生在我的第四个选项卡/VBOX上,其中包含Axiis折线图。一旦用户单击图表,错误就会出现在所有UI组件上,无论我单击何处。

    如果用谷歌搜索错误消息,大多数人会通过更改添加或删除UI对象的显式代码来解决它。这根本不是我的情况,我的代码中没有可以更改的显式添加或删除。这使我相信这是一个名称空间/框架/库问题,或者我的项目没有从UI/Canvas/名称空间的角度正确设计。我对flex4不够熟悉,不知道在哪里使用Spark、MXML、MX名称空间(s、fx、MX)等。

    任何帮助或想法是感激的,因为这个错误是一个当前的显示停止。谢谢!

    另外,我还收到通知,许多代码引用

    1 回复  |  直到 8 年前
        1
  •  1
  •   dan    14 年前

    为什么“DeviceLineChart”是一个 <mx:Application> ? 如果您不想加载子应用程序,您可能只想将其更改为 <mx:Canvas> 相反。如果您确实计划动态加载这些,那么您需要考虑使用模块加载器。您要告诉Flex的是,在您的系统中运行着两个应用程序,当您使用两个应用程序而不使用加载系统时,有一些像SystemManager这样的单例无法工作。

    推荐文章