2009-06-10 5 views
3

Я построил игру викторины с пузырьком вопроса. Длина пузырька зависит от длины вопроса. Я хочу, чтобы событие изменения в динамическом текстовом поле вызывало функцию, которая меняет размер пузыря вопроса.AS3 Textbox Change Event Not Firing

Однако событие изменения никогда не вызывается, когда значение моего текстового поля динамически изменяется из кода.

question_txt.addEventListener(Event.CHANGE, setTextBubbleSize); 

function setTextBubbleSize(event:Event):void 
    { 
     trace("QUESTION TEXT CHANGED"); 
     textBubble_mc.height = 30 + question_txt.text.length * 1.2; 
     if (textBubble_mc.height > 170) textBubble_mc.height = 170; 
     question_txt.y = textBubble_mc.y - textBubble_mc.height/6 + 10; 
    } 

Я хочу использовать событие изменения, потому что в моем коде есть несколько мест, которые могут задавать question_txt. Как я могу заставить текстовое поле активировать событие изменения?

Кроме того, есть ли способ подсчитать количество строк в вопросе_txt, чтобы более точно установить высоту textBubble_mc?

ответ

5

Да, как Дэвид комментарии, TextField только отправляет события CHANGE, когда он редактируется пользователем - на самом деле это обычно относится к большинству компонентов. Причина, конечно, состоит в том, что если вы вручную попытались изменить значение поля внутри вашего обработчика изменения, вы должны сделать рекурсивный цикл событий, которые вам придется вручную обнаружить.

То, что вы хотите сделать, это создать функцию-обертку, как:

function setQuestionText(s:String):void 
    { 
     question_txt.text = s; 
     setTextBubbleSize(); 
    } 

Для другого вопроса, нет никаких причин, чтобы оценить высоту TextField, основываясь на количестве строк или символов - просто установите text, и вы можете немедленно запросить текстовое поле height. Он будет точно отражать новую высоту поля, и если вы измените ширину поля, высота будет немедленно обновлена ​​и т. Д.

Или, если вам нужно знать какие-либо мелкие детали о размере текстового поля, вы можете всегда используйте TextExtent.

+0

В итоге я просто вызвал функцию, указанную в вашем примере кода. Для второго вопроса я хотел бы использовать свойство высоты текстового поля, но оно не изменяется автоматически. У меня есть динамическое текстовое поле на сцене, и если текстовое поле слишком маленькое, текст отключается. Я не вижу ничего в flash, чтобы сделать текстовое поле изменчивым. Я проверю библиотеку as3. Вы знаете, как сделать текстовое поле изменяемым по размеру текста. – Bryan

+0

Я понял. question_txt.autoSize = TextFieldAutoSize.CENTER; Спасибо феномам! – Bryan

+0

Это хорошо, но вы можете использовать существующие обработчики Event.CHANGE, вызывая question_txt.dispatchEvent (новое событие (Event.CHANGE)); – Triynko

7

Я не думаю, что событие CHANGE запускается, когда вы правильно изменяете текстовое поле с помощью as3. Но вы всегда можете поднять событие по:

dispatchEvent(new Event(Event.CHANGE, true)); 

Для количества строк в текстовом поле, вы можете использовать numLines должным образом в TextField

http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/text/TextField.html#numLines

+0

Большое спасибо Давида. Я полностью забыл о свойстве numLines. – Bryan

0

Как я вижу решения, это еще один класс, который расширяет TextField. Пример:

package { 
import flash.events.Event; 
import flash.text.TextField; 

public class MyTf extends TextField { 
    public function MyTf() { 
     super(); 
    } 

    override public function set text(value:String):void 
    { 
     super.text = value; 
     dispatchEvent(new Event(Event.CHANGE)); 
    } 

} 
}