Экземпляр TextField внутри кнопки, созданной в отдельном слое во Flash, является пустым во Flex - PullRequest
1 голос
/ 25 марта 2010

Я создал объект кнопки во флэш-памяти. Кнопка содержит 2 слоя. Одним из них является фоновое изображение, а поверх него текстовое поле. Текстовое поле является динамическим. Я использую кнопку внутри мувиклипа и экспортирую ее в SWC. Я пытаюсь использовать его в flex.

Я пытаюсь сделать это:

var myComponent:MyComponent = new MyComponent();
myComponent.button01.theTextField.text = "Caption";

Я получаю и экземпляр кнопки ( myComponent.button01 равен не равен нулю в отладчике Flex), но экземпляр textField ( myComponent.button01.theTextField *) 1011 *) равен null , и я не могу изменить текст (но текст по умолчанию отображается на экране). Код правильно скомпилирован во flex. У кого-нибудь есть идеи, что не так?

Я также экспортировал в SWC кнопку управления. Таким образом, кнопка - это не SimpleButton по умолчанию из Flash, а производный класс, сгенерированный Flash (с тем же именем, что и у символа, определенного во Flash). Он содержит элемент TextField, который является нулевым.

Вот временная шкала кнопки (слой 2 содержит текстовое поле, а экземпляр текстового поля называется TextField): альтернативный текст http://img59.imageshack.us/img59/5002/timeliney.jpg

Ответы [ 5 ]

4 голосов
/ 29 марта 2010

На самом деле проблем нет, все работает как надо. : -)

После создания экземпляра класса (new MyComponent ()) дочерние объекты сами не создаются, эта процедура откладывается. Только после добавления компонента в список отображения будут созданы все элементы управления. Таким образом, вам нужно получить доступ к субконтролям только после того, как вы фактически добавили объект в список отображения.

В элементах управления flex у вас есть событие creationComplete, которое используется именно для этой цели.

Подробнее о создании объекта можно прочитать здесь здесь .

1 голос
/ 26 августа 2010

Проблема в том, что SimpleButton является классом final . Другими словами, вы не можете добавить к нему ребенка или добавлять какие-либо свойства динамически. Я сделал простой тест с помощью кнопки (flash.display.SimpleButton) и TextField. Не было никакого способа получить дескриптор на TextField, который я мог бы найти, когда он был помещен на кнопку в IDE. Когда я сделал кнопку MovieClip, которая отлично работала. Поэтому вы должны поместить экземпляр Button на слой под TextField внутри символа MovieClip / Sprite. Вместо этого я добавил символы через код, поскольку у меня было два слегка отличающихся визуальных представления.

var button:MovieClip;
if (val1 < 10) {
    button = new LowButton();
    button.addEventListener(MouseEvent.CLICK, onLowClick);
    button.textField1.text = "You";
    button.textField2.text = "Stinker";
} else if (val1 > 10 && val1 < 100) {
    button = new MidButton();
    button.textField.text = "Middie";
... 

Вы поняли!

1 голос
/ 25 марта 2010

Я считаю, что вы не можете ссылаться на дочерние элементы кнопки (объект SimpleButton).

Если вы напишете быстрый тест во Flash, пытаясь изменить свойство .text для theTextField, я думаю, вы получите сообщение об ошибке во время выполнения, говорящее что-то вроде:

1119: доступ к возможно неопределенному свойству theTextField через ссылку со статическим типом flash.display: SimpleButton.

Извините, у меня нет информации о том, как решить вашу проблему. Надеюсь, это будет хорошей отправной точкой, чтобы помочь вам найти ответ на этот вопрос.

0 голосов
/ 18 ноября 2010

Создание видеоклипа.

Создайте 3 кадра, присвойте им имена: «out» - кадр # 1, «click», «over».

Добавить текстовое поле к другому слою, как на временной шкале (в первом сообщении)

Добавить этот код в кадр # 1

stop();
addEventListener(MouseEvent.MOUSE_OVER, on_over, false, 0, true);
addEventListener(MouseEvent.CLICK, on_click, false, 0, true);
addEventListener(MouseEvent.MOUSE_OUT, on_out, false, 0, true);


function on_out(e:MouseEvent):void 
{
    gotoAndStop("out");
}

function on_click(e:MouseEvent):void 
{
    gotoAndStop("click");           
}

function on_over(e:MouseEvent):void 
{
    gotoAndStop("over");
}

Теперь в коде вы можете использовать этот клип в качестве супер-кнопки (создать, добавить прослушиватель событий щелчка, назначить текст заголовка без исключений null и т. Д.)

0 голосов
/ 25 марта 2010

Похоже, ваш ссылочный путь к theTextField проблематичен.Если вы отлаживаете во Flex, изучите вкладку переменных и посмотрите, можете ли вы найти myComponent , затем myComponent.button01 , а затем myComponent.button01.theTextField .

...