AS3文本框自动滚动到底部

5
如何在ActionScript中以编程方式向TextField添加文本时自动滚动到底部:
var _output:TextField = new TextField();
for (var i:int = 0; i < 100; ++i) {
    _output.appendText("Hello World!");
}

同时要考虑启用文本字段的垂直滚动,一旦添加新文本,则应再次自动滚动到底部。


1
请注意,您正在连续一百次将“Hello World!”赋值给_output.text。您应该调用appendText() - Vesper
2个回答

9
你应该监听待处理的TextField的Event.CHANGE事件。点击这里查看关于textField的事件描述,如果你能捕获到此事件,你可以使用scrollV属性进行处理。举例来说:
_output.addEventListener(Event.CHANGE,scrollAllDown);
function scrollAllDown(e:Event):void {
    var tf:TextField=(e.target as TextField);
    if (!tf) return; 
    tf.scrollV=tf.maxScrollV;
}

更新:捕获 Event.CHANGE 无效,我将其保留以防有人偶然使用此方法并发现它不起作用。所以,唯一的方法是子类化 TextField 并手动重写 appendText() 方法来包含滚动,像这样:
public class OutputTF extends TextField 
{ 
    // constructor omitted
    override public function appendText(text:String):void 
    { super.appendText(text); this.scrollV=this.maxScrollV; } 
}

1
好的,假设您需要多个textField进行自动滚动 - 那么您将有两行addEventListener(Event.CHANGE,scrollAllDown)分别针对两个不同的TextFields,并且为了确定哪个 TextField已经触发了事件,您需要处理e.target - Vesper
1
你也可以从附加文本的代码中手动分派“CHANGE”操作。 - Amy Blankenship
@AmyBlankenship 日志记录器的目的是存储和显示文本,对于这个任务,TextField 是最佳选择。如果你要扩展 Sprite,仍然需要在其中包含一个 TextField,这有点违背了扩展 Sprite 的目的。此外,如果你将嵌入的 TextField 发布出来,或者发布其所有属性以允许自定义,这些都是通过扩展 TextField 来完成的。Sprite 是一个完全不同用途的工具,将其作为日志记录器的基础就像用显微镜作为锤子的底座一样不合适。 - Vesper
TextField并不是用来记录日志的,所以这有点鱼与熊掌不可兼得。使用Sprite的重点在于你可以拥有一段能够写入TextField(并手动调用其CHANGE事件或者甚至分发自己的自定义事件以更好地表达日志记录的目的)的代码。我认为这个帖子存在的原因就是Macromedia从未打算扩展TextField。 - Amy Blankenship
如果你想学习良好的面向对象设计,那么让代码的多个部分写入日志记录器可能不是一个好主意。相反,最好创建一种数据对象来存储日志信息,然后使用某种控制器在该数据对象发生更改时更新文本字段中的文本。 - Amy Blankenship
显示剩余6条评论

2
你可以使用TextField的scrollV和maxScrollV属性:
var _output:TextField = new TextField();
for (var i:int = 0; i < 100; ++i) {
    _output.appendText("Hello World!");
    //set vertical scroll position to max value
    _output.scrollV = _output.maxScrollV;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接