LWUIT的List应用系列(三)解决List获得焦点时Form自动向下滚的Bug

在LWUIT应用中,当List获取焦点并显示大量数据时,Form滚动条会滚动到底部,这带来不便。本文提供两种解决方案:1. 设置Form不可滚动;2. 结合SelectionListener和FocusListener事件处理。通过代码示例说明了如何使用revalidate()方法实现界面重绘,以达到预期效果。

LWUIT的List应用系列(二)中我们知道了怎么绑定数据,怎么做相应的事件。注意,我只做了ActionListener事件,而SelectionListener事件和FocusListener事件没做,这是我在这一节中要用到的。
首先看看我在哪个地方需要用到它,我们在用List显示比较多的数据的时候,不知道你们有没有发现一个让人很不爽的效果:当List(List的第一项)获得焦点时,如果数据很长,Form的滚动条会直接滚动到底部,对于这种情况我找到了两种解决办法。

方法1:
这种方法最直接最简单,既然羊毛出在羊身上(滚动条是Form的),那我们就直接设置Form不可滚动。

方法2:
我的山寨方法,同时使用SelectionListener事件和FocusListener事件。
代码:

  personList.addFocusListener(new FocusListener() {

            public void focusGained(Component c) {

                if (personList.getSelectedIndex() == 0) {
                    ListForm.this.setScrollable(false);
                    //注释掉这一句,让Form不进行验证,使滚动条仍然存在
                    //ContactsForm.this.revalidate();
                }
            }

            public void focusLost(Component c) {
                ListForm.this.setScrollable(true);
            }
        });

        personList.addSelectionListener(new SelectionListener() {

            public void selectionChanged(int oldSelection, int newSelection) {
                //当选中的不是第一项时,重新设置Form可滚动。
                if (oldSelection > 0) {
                    ListForm.this.setScrollable(true);
                    ListForm.this.revalidate();
                }
            }
        });

 

 

注意revalidate()方法,这个方法的作用是让界面重新验证,就是重绘的意思(repaint)。这个方法在某些场合非常有用,比如你想删除某些组件,可以调用removeComponent()方法,但是必须调用revalidate()方法,使页面重绘,否则你仍然能看到这个组件。当然你若想局部刷新某个组件的内容,可以通过remove – revalidate – add - revalidate的步骤来实现。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值