2009-12-21 30 views
0

在我的应用程序中,我有一个图表,我想在单击时显示在TitleWindow中。Flex TitleWindow.addChild删除原始对象

 var win:TitleWindow = PopUpManager.createPopUp(this, TitleWindow, false) as TitleWindow; 
     win.addChild(myChart); 
     PopUpManager.bringToFront(win); 

它确实将图表放置在显示的标题窗口中,但它从父级删除了原始图表。然后,当标题窗口关闭时,我的图表就消失了。我无法弄清楚如何克隆图表 - 我尝试过的所有方法都失败了 - 我不知道为什么会发生这种情况。

解决方案:

public var barChart:BarChart; 
    public function onClick(e:Object):void 
    { 
    barChart = (e as BarChart); 
    if(barChart != null) 
    { 
     var win:MyWindow = PopUpManager.createPopUp(this, MyWindow, false) as MyWindow; 
     PopUpManager.centerPopUp(win); 

    } 
    } 

// ... MyWindow.mxml ...

var _parent:Object; 
private function creationComplete(e:Event):void 
{ 
    bChart = parentApplication.barChart; 
    _parent = bChart.parent; 
    this.addChild(bChart); 
} 

private function onMyWindowClose(evt:CloseEvent):void { 
    _parent.addChild(bChart); 
    PopUpManager.removePopUp(this); 
} 

回答

0

当你做一个addChild对象被重新设置,正如所说的Simon one DisplayObject不能属于父母。如果在打开弹出窗口时没有在同一时间内看不到两个图表,那么可以在打开弹出窗口之前保存子父窗口和索引,并在关闭弹出窗口时恢复子窗口状态。

开放

myChartParent=myChart.parent; 
myChartIndex=myChartParent.getChildIndex(myChart); 

收盘前

myChartParent.addChildAt(myChartIndex); 

但是,如果你想看到两个图表,你将不得不创建两个图表实例时

+0

嘿,我来这里发布这个确切的解决方案。 – FlexMan 2009-12-21 09:20:19

0

我没有设法找到文档来支持它,但我相信,一个Flash UI组件只能有一个父级。当你调用addChild()时,我怀疑控件的血统会改变,并从另一个窗口中消失。由于父母身份已经改变,当新的TitleWindow消失时,它会收集垃圾。

我认为我会在你的位置做的事情是将图表抽象出来以便自己控制,所以你不必重复代码,在常规窗口和弹出窗口中使用相同的控件,并传递数据在createPopUp调用之后调用它。

+0

图表生成并嵌入到自定义组件中。数据在该组件中处理,我可以使用这些数据的唯一方法是在生成组件后从组件中拉出图表。 – FlexMan 2009-12-21 08:30:47

+0

这很不幸,这听起来像你有一个更深刻的架构问题,这与Flex/Flash的工作方式有些不一致。 @帕特里克的答案可能有效,但我认为你可能会做得很好,使数据和演示文稿之间更清晰分离。 – Simon 2009-12-21 09:13:44