FocusTraversalPolicy定制焦点顺序

FocusTraversalPolicy是 JDK1.4 以后引入的用来定制焦点顺序的新特性 
还是拿例子来说吧:
public class MyIFrame extends JInternalFrame {
   ......
   
   protected void setCompFocus(Component[] compFocus) {

               getContentPane().setFocusable(false);
               setFocusTraversalPolicy(new                 
                       Custom_FocusTraversalPolicy(compFocus));
   }

   class Custom_FocusTraversalPolicy extends FocusTraversalPolicy {
       Component[] compFocus;
       List list;
       public Custom_FocusTraversalPolicy() {
       }
       public Custom_FocusTraversalPolicy(Component[] compFocus) {
           this.compFocus = compFocus;
           list = Arrays.asList(compFocus);
       }

       public Component getFirstComponent(Container focusCycleRoot) {
           return compFocus[0];
       }
       public Component getLastComponent(Container focusCycleRoot) {
           return compFocus[compFocus.length - 1];
       }
       public Component getComponentAfter(
               Container focusCycleRoot, Component aComponent) {
          int index = list.indexOf(aComponent);
          if(compFocus[(index + 1) % compFocus.length].isEnabled() ){
              return compFocus[(index + 1) % compFocus.length];
          } else {
              return              
                 getComponentAfter(focusCycleRoot,compFocus[(index +
                 1)  % compFocus.length]);
          }
       }
       public Component getComponentBefore(
Container focusCycleRoot,
Component aComponent) {
           int index = list.indexOf(aComponent);
           if(compFocus[(index - 1 + compFocus.length)%
                   compFocus.length].isEnabled() ){
               return compFocus[(index - 1 + compFocus.length)%
                       compFocus.length];
           }else{
               return   
                     getComponentBefore(focusCycleRoot,compFocus[(index                  
                     - 1 + compFocus.length)% compFocus.length]);
          }
       }
       public Component getDefaultComponent(Container
               focusCycleRoot) {
                   return compFocus[0];
       }
   }
}

这样,假设定义在MyIFrame上的组件有: a,b,c,d  要求:画面启动后焦点在b上,按"TAB"件,焦点按 b->d->c->a 的顺序循环,且跳过disable的控件。则以数组{b,d,c,a}为参数调用setCompFocus方法即可。  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值