[Flex][问题笔记]TextArea滚动条问题

本文介绍了在Flex中解决即时通讯应用中滚动条不能自动滚动到底部的问题。提供了两种解决方案:一是通过调用validateNow()函数强制刷新组件;二是通过添加时间延迟确保组件已刷新。并详细介绍了几种实现延时的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用flex做即时通讯,收到的最新消息应该在最下面,但textArea的滚动条默认在最上方,不方便查看最新消息。
可以使用TextArea.verticalScrollPosition = TextArea.maxVerticalScrollPosition;定位到最下方,但实际实现时,总是不能滚动动最后,而是倒数第二个。
ActionScript3天地会有人遇到了和我一样的问题:如何让垂直滚动条定位到最下面的位置
后来在群里问了一下,原因是数据源虽然更新了,但是组件还没有刷新,解决方法有两种:
一:validateNow(),在设verticalScrollPosition之前先调用一下这个函数,强制刷新组件。(有高手指点说,此方法虽然是某个组件调用,却会使整个UI全部刷新,致使CPU占用过大,不推荐。其实UIComponent的validateNow()其实它内部也使用timer和enterframe进行的,所以推荐下面的方法)
二:加一个时间延时,具体加多长时间延时就不好说了,不能让用户感觉到延时,而且保证组件已经刷新了,所以需要多次测试哦!
即然说到了加延时,那如何加延时呢,我总结了一下,目前我知道的有如下几个方法:
一:Timer

1 var timer : Timer = new Timer( 100, 1 );
2 timer.addEventListener( TimerEvent.TIMER_COMPLETE, func );
3 timer.start();这个方法是从http://www.k-zone.cn/的某一篇文章里提取出来的,不知道正不正规。
还有就是要注意垃圾回收,即在func里timer.stop();
二:setTimeout
我觉得这个方法其实是调用了一个工具方法。

flash.utils.setTimeout(function():void{Alert.show("only show once");}, 2000, null);
注意里面第一个参数必须是函数!个人认为这个比较好,多精简!
三:setInterval,可以重复
1<?xml version="1.0" encoding="utf-8"?>
2<mx:Application initialize="initTimter()" xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
3<mx:Script>
4    <![CDATA[
5    import mx.controls.Alert;
6    public var count:Number=2; //定义时间长度(秒)
7    public var intervalId:Number;//定时器参数
8    //定时器起动口
9    public function initTimter():void{
10        intervalId = setInterval(doTimter,1000);
11    }
12    //定时器回调方法
13    public function doTimter():void{
14        showLabel.text = count.toString() + "second to go";
15        count -= 1;
16        if(count == 0){
17            showLabel.text = count.toString() + "second to go";
18            count=2;//重新开始定时
19            //clearInterval(intervalId);//移除定时 ,为了演示循环,屏蔽之
20            Alert.show("Time is up");
21        }
22    }
23]]>
24</mx:Script>
25<mx:Label id="showLabel"/>
26</mx:Application>

Code
1<?xml version="1.0" encoding="utf-8"?>
2<mx:Application initialize="initTimter()" xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
3<mx:Script>
4    <![CDATA[
5    import mx.controls.Alert;
6    public var count:Number=2; //定义时间长度(秒)
7    public var intervalId:Number;//定时器参数
8    //定时器起动口
9    public function initTimter():void{
10        intervalId = setInterval(doTimter,1000);
11    }
12    //定时器回调方法
13    public function doTimter():void{
14        showLabel.text = count.toString() + "second to go";
15        count -= 1;
16        if(count == 0){
17            showLabel.text = count.toString() + "second to go";
18            count=2;//重新开始定时
19            //clearInterval(intervalId);//移除定时 ,为了演示循环,屏蔽之
20            Alert.show("Time is up");
21        }
22    }
23]]>
24</mx:Script>
25<mx:Label id="showLabel"/>
26</mx:Application> 以上代码来自http://elprup.javaeye.com/blog/409442我做了一个小小的修改,以便能体现出它的重复特点。

 

转自:http://bbs.airia.cn/FLEX/thread-7842-1-1.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

游鱼_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值