2006年8月21日
Flash | 同一のDisplayObjectインスタンスは複数同時に表示できない
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()">
<mx:Script>
<![CDATA[
import mx.controls.Label;
public function init():void {
var l:Label = new Label();
l.text = "text";
box.addChild(l);
box.addChild(l); // RangeError: Error #2006: 指定したインデックスが境界外です。
}
]]>
</mx:Script>
<mx:VBox id="box" />
</mx:Application>Flexでこのようなコードを書くと、boxの中に2つの「text」が縦に並びそうだけど、実際にはランタイムエラーが発生する。「インデックスが境界外」って、インデックスは指定してないのに、とハマってしまった。その後、いろいろ実験してみて、DisplayObjectContainerには同一インスタンスを2つ以上追加できないようになっていることが分かった。よくよく調べてみると、
Class DisplayObjectContainer - addChild() methodと、ドキュメントに出ていた。
If you add a child object that already has a different display object container as a parent, the object is removed from the child list of the other display object container.
つまり、DisplayObjectContainerに同一インタンスの重複登録ができないのではなく、登録される側のDisplayObjectが親(所属)コンテナを一つしか持てないということだった。納得。
だけど、例えば同じ画像を複数表示したい場合は、Imageオブジェクトを複数作らないといけない。clone()メソッドを実装したサブクラスを作ってしまえばいいと思うのだけど、プロパティを全部コピーするコードを書くのが面倒。BeanUtils#copyProperties(Object, Object)的なライブラリはないかな?
Comment