2012-11-07 115 views
0

我想在Flex 3中創建自定義容器。 我希望此容器具有一個內部容器,它可以是TabNavigator或VBox,具體取決於用戶設置的某個標記。這個標誌在頁面呈現後不會改變,所以我不需要從一個組件「動態」移動到另一個組件。自定義Flex 3容器

到目前爲止,我有這樣的代碼:

public class AccNavigator extends Container { 
public var container:Container; 

public function AccNavigator() { 
    if (GlobalSettings.Vertical) { // This is the said variable 
     container = new VBox(); 
    } 
    else { 
     container = new TabNavigator(); 
    } 
    container.percentHeight = 100; 
    container.percentWidth = 100; 
} 

override protected function createChildren():void { 
    super.createChildren(); 
    this.addChild(container); 
} 

override public function addChild(c:DisplayObject):DisplayObject { 
    if (c == container) { 
     // MessageAlert is the same as an Alert but with custom code 
     MessageAlert.show("addChild: Adding Container"); 
     super.addChild(c); 
    } else { 
     MessageAlert.show("addChild: " + c.toString()); 
     container.addChild(c); 
    } 
    return c; 
} 

override protected function initializationComplete():void { 
    // used for bebugging purposes 
    MessageAlert.show("container is visible: " + container.visible.toString()); 
    MessageAlert.show("this is visible: " + visible.toString()); 
    MessageAlert.show("container children: " + container.numChildren); 
    MessageAlert.show("this children: "+ this.numChildren); 
} 
} 

我使用這個自定義容器在MXML這樣的:

<AccNavigator> 
    <HBox> 
     <more things...> 
    </HBox> 
    <HBox> 
     <more things...> 
    </HBox> 
</AccNavigator> 

但是當我運行應用程序,沒有任何組件都可見。 當執行initializationComplete代碼,我看到以下內容:

  • 容器可見:真
  • 這是明顯的:真正的
  • 容器孩子:2個
  • 這個孩子:1

我花了一些時間閱讀這個http://www.developmentarc.com/site/sites/default/files/understanding_the_flex_3_lifecycle_v1.0.pdf 瞭解組件生命週期,但我仍然無法理解我的代碼中缺少的內容。

有人可以幫助我,告訴我我錯過了什麼嗎?

謝謝。

回答

0

問題是我不應該擴展容器。 因此,類聲明如下所示:

public class AccNavigator extends VBox { 
.... 
} 

其他所有內容都是正確的。

0

從希望容器基於的容器類型擴展。例如如果你想基於HBox或VBox實現某些基於VBox的實現,則從HBox擴展。從技術上講,可以擴展Container,但由於Container太接近層次結構的「根」,因此必須以某種方式「重新發明輪子」。