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

来源:互联网 发布:易语言进销存管理源码 编辑:程序博客网 时间:2024/05/19 14:00

在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的步骤来实现。

原创粉丝点击