2010-07-25 55 views
0

我有一個組件,它繼承了Group。我做了一個名爲dataSource:ArrayList的屬性。我想爲每個條目畫一條線。Flex 4生命週期和手動繪製東西

當「功能設置數據源」 -method被調用i執行以下(簡化):

 var newLine:Line = new Line();  
     newLine.stroke = new SolidColorStroke(); 
     newLine.xFrom = 0; 
     newLine.yFrom = 0; 
     newLine.xTo = 0; 
     newLine.yTo = height; 
     this.addElement(newLine); 

線本身不伸展到母體的最底部。我在猜測我搞亂了生命週期,但我沒有發現特別容易理解的flex生命週期,所以我不知道如何去做這件事。

回答

0

我同意你的觀點,它可能與創建線條時尚未正確測量的部件有關。您可以嘗試重寫updateDisplayList並將您創建的行的高度設置爲提供給updateDisplayList方法的高度參數。不要在updateDisplayList中創建行,因爲它可以在組件生命週期中多次調用。關於一般的生命週期,以下是我在過去發現有幫助的圖表的鏈接:http://danorlando.com/?p=122希望有所幫助。

1

如果你不想以線顯示列表上的對象互動,我會簡單地使用Graphics api把它收回去updateDisplayList(),並呼籲invalidateDisplayList()set dataSource()

「正確」的方法是稍微詳細;-)

private var dataSourceValid = true; 

public function set dataSource(value:FooData):void { 
    _dataSource = foo; 
    dataSourceValid = false; 
    invalidateProperties(); 
} 

override protected function commitProperties():void { 

    if (!dataSourceValid) 
     commitDataSource(); 

    // Do it later in case we've invalidated something 
    // belonging to Flex while validating our stuff 
    super.commitProperties(); 
} 

protected function commitDataSource():void { 

    // Do whatever we need to with our datasource, 
    // including adding or removing child elements. 

    // ... 

    // If we also need to re-draw something, then 
    // invalidateDisplayList(); 

    dataSourceValid = true; 
} 

(在TextMate的類型,因此它可能是完全的拼寫錯誤,並不能編譯,但你的想法的所有代碼)

+0

知道如何根據生命週期的「正確的方式」,如果Id'e想保持行作爲對象(並使用addElement)? – 2010-07-28 07:37:10

0

它並不完全清楚什麼您我們希望這樣做,但通過在Group上放置dataSource財產,看起來好像您正在嘗試重新發明DataGroup。也許你應該考慮使用後者,而不是自定義ItemRenderer,你可以在其中畫出一條線?