2009-12-21 33 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