在Swing UI界面定义默认获得焦点的组件

最近写了个小的UI界面的程序.程序运行后,为方便使用,应该自动把焦点定位在负责主要工作的部件上,但如何实现这个简单的功能,还着实让我这类出学者查了些资料.

首先说一下swing中组件默认获得焦点的机制.在swing的窗体中,先被添加进来的组件,如果可以获得焦点,则会优先获得焦点.这是它的默认规则.但我们可以通过组件调用其自身的requestFocus()方法,来强制某组件优先获得焦点.

但这里有一个隐含的问题,那就是直接让这个组件在创建后,就调用requestFocus()是没有任何作用的!!!因为swing中,对焦点的设置是在窗体初始化并显示前最后一刻才执行的,你如果在组件中直接调用requestFocus(),虽然代码也执行了,但却是在设置焦点操作之前执行的,那也自然就无效了.而我们知道了这一点,就好说了,把调用requestFoucs()方法的代码加入的合适的地方不就ok了吗?那么哪里是这个地方呢,那就是给窗体JFrame增加WindowListener事件监听器,然后把对组件requestFocus()方法的调用放在windowOpened(java.awt.event.WindowEvent evt)事件中就可以了.也就是说在打开窗体的时候执行我们的焦点定义代码.这个时候正好是swing设置焦点的刹那!我们的代码也如愿发挥了功效.

例如我要让我的一个JTextArea theText默认获得焦点,就可以写如下代码片段:

addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowOpened(java.awt.event.WindowEvent evt) {
                focusEvt(evt);
            }
        });
//定义窗体打开时的默认获得焦点的组件
    private void focusEvt(java.awt.event.WindowEvent evt) {                         
        theText.requestFocus();
    }

其实上面的操作,如果在netBeans中来完成,就太简单了.只需要选择JFrame窗体组件,在属性面板的事件中,选择添加一个windowOpened事件,把theText.requestFocus();写在事件代码中就ok了,呵呵,这也正是我十分喜欢netbeans的原因,太方便了.好了,不罗嗦了,相信大家都明白了,如果有和我一样的朋友,希望这篇文章可以节省您的时间去四处搜索资料.

                                                        2006-11-19 12:36

你可能感兴趣的:(工作,UI,swing,Netbeans)