Событие изменения текстового поля AS3 не запускается - PullRequest
3 голосов
/ 11 июня 2009

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

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

 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;
    }

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

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

Ответы [ 3 ]

7 голосов
/ 11 июня 2009

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

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

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

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

5 голосов
/ 11 июня 2009

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

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

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

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

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

0 голосов
/ 23 марта 2012

Как я вижу решения, это еще один класс, расширяющий 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));
    }

}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...