コンテナとスクロールバーとswapChildren

はじめまして、s-ohiraです。
いつもは違う名前で他のブログ使ってます。

なんだかHatenaは技術系の人が多くブログを書いているので、お試しです。


今日はFlex2のコンテナで苦労しました。

コンテナはContainerというクラスから派生するコンポーネントです。
CanvasやBoxをはじめとする多くのコンポーネントに使われていますが、
その一番の特徴は「スクロールバーが自動ででること」。
「違うだろ」といわれそうですが、コードを見る限りではこの通りです。


で、コンテナクラスがスクロールバーを表示するために何をしているのかというと、
コンポーネントの領域が表示領域からはみ出したさいに、内部で「contentPane」という
FlexSpriteオブジェクトを作成して、ユーザーの追加した子コンポーネントをすべて
この上に配置しなおします。
こうすることによって領域が計算しやすくなるので、スクロールバーをつけて長さを
調整したりしているのです。
clipContentというプロパティをonにすると、必要に応じてcontentPaneが作られたり消えたりします。


で、内部的にはcontentPaneが作られているときは、rawChildrenがcontentPane一個になってしまいます。
ContainerのnumChildrenは通常の数が返されますが、rawChildrenのnumChildrenが1個になっているときは
contentPaneが使われているときと言えます。
addChildなどのメソッドなどは、contentPaneがあるときはその上にaddするように、ちゃんと
オーバーライドされています。




・・・ところが。


swapChildren、swapChildrenAtといった階層並べ替えのメソッドを初めとする、いくつかのメソッドは
オーバーライドされていません。
たとえば、CanvasのswapChildrenを実行すると、contentPaneがないときにはうまくいきますが、
スクロールバーを出す状況になると、getChildAtでエラーが発生します。
contenlPaneが出来るおかげでchildの配列が足りなくなるためです。


現状では、ContainerでrawChildren.getChildAt(0).nameをみて、"contentPane"だったら同じメソッドを
rawChildrenの子供に対して行う、ということでしのぐしかないようです。


余談ですが、swapChildrenのありがたみはバカになりません。
自前でソートすると結構重いです・・・。