У меня есть приложение FLEX 4, и у меня возникают проблемы с динамическим добавлением элементов управления пользовательского интерфейса. В основном с переключателями.
Вот пример, демонстрирующий мою проблему:
<s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
creationPolicy="all"
>
<fx:Script>
<![CDATA[
import mx.containers.Form;
import mx.containers.Panel;
import mx.controls.Label;
import mx.controls.NumericStepper;
import mx.controls.RadioButton;
private var theChar:String = "B";
protected function btnAdd_clickHandler(event:MouseEvent):void
{
var theForm:Form = new Form();
theForm.label = theChar;
//1. Label
var myLabel:Label = new Label();
myLabel.text = "My Label";
myLabel.width=120;
theForm.addChild(myLabel);
//2. Numeric Stepper
var myNumStepper:NumericStepper = new NumericStepper();
myNumStepper.id = "numPointHigh" + theChar;
myNumStepper.name = "numPointHigh" + theChar;
myNumStepper.minimum = 0;
myNumStepper.maximum = 120;
myNumStepper.width = 50;
myNumStepper.height = 30;
theForm.addChild(myNumStepper);
//3. radio button
var myRadioButton:RadioButton = new RadioButton;
myRadioButton.id = "myRadioButton" + theChar;
myRadioButton.name = "myRadioButton" + theChar;
myRadioButton.label = "my radio button";
myRadioButton.selected = true;
theForm.addChild(myRadioButton);
//4. Panel
var thePanel:Panel = new Panel();
thePanel.width = 300;
thePanel.height = 475;
thePanel.name=theChar;
thePanel.title = "My Profile Panel";
thePanel.setStyle("backgroundColor", "blue");
//add the form to the panel
thePanel.addChild(theForm);
//add the Panel to the list control
myContainer.addChild(thePanel);
}
protected function btnClear_clickHandler(event:MouseEvent):void
{
var numChildren:Number = myContainer.numChildren;
for(var i:Number=numChildren - 1; i > -1; i--){
myContainer.removeChildAt(i);
}
}
]]>
</fx:Script>
<mx:VBox width="100%">
<mx:Panel id="myContainer" />
<mx:Button id="btnAdd" label="Add a panel" click="btnAdd_clickHandler(event)" color="black"/>
<mx:Button id="btnClear" label="Clear" click="btnClear_clickHandler(event)" color="black" />
</mx:VBox>
</s:Application>
^ Запустите это. Нажмите кнопку «Добавить панель». Затем нажмите «Очистить». Затем снова нажмите кнопку «Добавить панель». Вы увидите ошибку:
ArgumentError: Ошибка № 2025: предоставленный объект DisplayObject должен быть дочерним по отношению к вызывающему. в flash.display :: DisplayObjectContainer / getChildIndex () в mx.core :: Container / getChildIndex () [E: \ dev \ 4.0.0 \ frameworks \ projects \ framework \ src \ mx \ core \ Container.as: 2833] в mx.containers :: Panel / getChildIndex () [E: \ dev \ 4.0.0 \ frameworks \ projects \ framework \ src \ mx \ container \ Panel.as: 1174] в mx.controls :: RadioButtonGroup / widththOrderCompare () [E: \ dev \ 4.0.0 \ frameworks \ projects \ framework \ src \ mx \ controls \ RadioButtonGroup.as: 600] в mx.controls :: RadioButtonGroup / widththOrderCompare () [E: \ dev \ 4.0.0 \ frameworks \ projects \ framework \ src \ mx \ controls \ RadioButtonGroup.as: 611] в mx.controls :: RadioButtonGroup / widththOrderCompare () [E: \ dev \ 4.0.0 \ frameworks \ projects \ framework \ src \ mx \ controls \ RadioButtonGroup.as:611] в массиве $ / _ sort () в массиве / http: //adobe.com/AS3/2006/builtin :: sort () в mx.controls :: RadioButtonGroup / http: //www.adobe. com / 2006 / flex / mx / internal :: addInstance () [E: \ dev \ 4.0.0 \ frameworks \ projects \ framework \ src \ mx \ controls \ RadioButtonGroup.as: 465] в mx.controls :: RadioButton / addToGroup () [E: \ dev \ 4.0.0 \ frameworks \ projects \ framework \ src \ mx \ controls \ RadioButton.as: 574] в mx.controls :: RadioButton / commitProperties () [E: \ dev \ 4.0.0 \ frameworks \ projects \ framework \ src \ mx \ controls \ RadioButton.as: 514] в mx.core :: UIComponent / validateProperties () [E: \ dev \ 4.0.0 \ frameworks \ projects \ framework \ src \ mx \ core \ UIComponent.as: 7772] в mx.managers :: LayoutManager / validateProperties () [E: \ dev \ 4.0.0 \ frameworks \ projects \ framework \ src \ mx \ manager \ LayoutManager.as:572] в mx.manager :: LayoutManager / doPhasedInstantiation () [E: \ dev \ 4.0.0 \ frameworks \ projects \ framework \ src \ mx \ manager \ LayoutManager.as: 730] в mx.managers: : LayoutManager / doPhasedInstantiationCallback () [E: \ dev \ 4.0.0 \ frameworks \ projects \ framework \ src \ mx \ manager \ LayoutManager.as: 1072]
Я не понимаю, почему я не могу повторно добавить переключатель после первого нажатия? Это происходит только тогда, когда у меня есть радиокнопки, добавляемые в форму / панель.
Если вы закомментируете код для переключателя (раздел комментария № 3), вы можете легко повторно добавить панели. Попробуйте, закомментируйте это, и вы сможете без проблем добавлять, повторно добавлять панель:
//3. radio button
//var myRadioButton:RadioButton = new RadioButton;
//myRadioButton.id = "myRadioButton" + theChar;
//myRadioButton.name = "myRadioButton" + theChar;
//myRadioButton.label = "my radio button";
//myRadioButton.selected = true;
//theForm.addChild(myRadioButton);
Почему это происходит и как это исправить? Почему это происходит только с переключателями? Я могу использовать флажки, текстовые поля, что угодно, и это не вызывает таких исключений ... какие-нибудь идеи?