我用卡通问题泡泡建立了一个问答游戏。根据问题的长度调整泡沫大小。我想在动态文本框上进行更改事件,以调用更改问题气泡大小的函数。
但是,当我从代码中动态修改文本框值时,永远不会调用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的高度?
答案 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));
}
}
}