UIComponent базовый класс не работает - PullRequest
1 голос
/ 04 января 2010

У меня есть BaseComponentClass, который я использую как класс, который расширяет все мои пользовательские компоненты. По какой-то причине ни один из моих пользовательских компонентов не отображается во время выполнения. Я не получаю никаких ошибок компиляции или во время выполнения либо. Я реализую все защищенные методы UIComponent. Мой код выглядит так:

public class BaseComponentClass extends UIComponent
{
    public function BaseComponentClass()
    {
        super();
    }

    override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void 
    {
            super.updateDisplayList(unscaledWidth, unscaledHeight);
    }       

    override protected function createChildren():void 
    {
        super.createChildren();

        for (var i:uint=0; i < super.numChildren; i++)
        {
            var childObj:DisplayObject = super.getChildAt(i);
            addChild(childObj);
        }           
    }

    override protected function commitProperties():void 
    {
        super.commitProperties();
    }

    override protected function measure():void 
    {
        super.measure();
    }
}

Затем я использую его в качестве базового класса в моих пользовательских компонентах mxml примерно так:

<local:BaseComponentClass xmlns:local="local.com.*" xmlns:mx="http://www.adobe.com/2006/mxml">
     <mx:Button id="btn" label="My Button" />
</local:BaseComponentClass>

Кнопка никогда не появляется во время выполнения.

Ответы [ 3 ]

1 голос
/ 05 января 2010

Очевидно, вы хотите добавить дочерние объекты в ваш BaseComponent.

Почему вы не наследуете от класса, который поддерживает эту функцию, такого как Box или Canvas?

0 голосов
/ 05 января 2010

Я не уверен в лучших практиках, поэтому изучите это перед его реализацией, но если бы это был я, я бы создал свойство массива (дочерние элементы доступны из uicomponent), а затем где-нибудь в классе использовал бы тег метаданных defaultProperty ([DefaultProperty ("children")]).

Если бы вы отлаживали свой код и помещали точку останова в цикл for, вы бы никогда не нажали код addChild. на самом деле, перейдите к определению (f3) createChildren (uiComponent.createChildren), и вы найдете его пустым. Вы должны явно вызвать addChild в установщике свойств по умолчанию, который вы создаете. Лучше всего, если вы всегда собираетесь использовать этот компонент как контейнероподобный класс, это просто расширить контейнер. F3 в эти классы, чтобы почувствовать лучшие практики.

0 голосов
/ 04 января 2010

Вы пытались установить ширину и высоту для этого компонента?

По умолчанию ширина и высота UIComponent установлены на 0.

здесь вы можете посмотреть документацию по умолчанию и изменить ее соответствующим образом на базовом компоненте: http://livedocs.adobe.com/flex/3/langref/mx/core/UIComponent.html

Удачи!

...