AS3文本框更改事件未触发

时间:2009-06-10 20:00:38

标签: actionscript-3 events dynamic textbox

我用卡通问题泡泡建立了一个问答游戏。根据问题的长度调整泡沫大小。我想在动态文本框上进行更改事件,以调用更改问题气泡大小的函数。

但是,当我从代码中动态修改文本框值时,永远不会调用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 个答案:

答案 0 :(得分:7)

当您使用as3正确更改文本框时,我认为不会触发CHANGE事件。但你总是可以通过以下方式举起活动:

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

对于文本框中的行数,您可以正确使用TextField的numLines

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

答案 1 :(得分:5)

是的,正如David评论的那样,TextField仅在用户输入编辑时调度CHANGE事件 - 事实上,大多数组件通常都是如此。当然,原因是因为如果您手动尝试更改“更改”处理程序中的字段值,则需要进行事件的递归循环,而这些事件必须手动检测出来。

你想做的是做一个包装函数,如:

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

对于您的其他问题,没有理由根据行数或字符数来估算文本字段的高度 - 只需设置text属性,您就可以立即查询文本字段height。它将准确反映该字段的新高度,如果您更改字段的宽度,则会立即更新高度等。

或者,如果您需要了解有关文字字段大小的任何详细信息,可以随时使用TextExtent

答案 2 :(得分: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));
    }

}
}