三十岁以前

带着那把青春的长剑    和赤子的良心
说服自己不出卖理想的灵魂
在最寂寞    和最不流泪的晚上
即使    连自己都在笑自己傻时
依然拔出怀中的    长剑
刺痛自己    提醒自己    勇往直前

· 所有网志 · java学习 · Web2.0 · 心情篇 · 好文 · 乱七八糟 · 游山玩水 · 光·影 ·
日历
站内搜索
友情链接
· 管理我的Blog
· 我的光影视界
· wormandhot
· 爱因斯坦和弗洛伊德
· ddb
· 子在川上曰
· bobo
· blog backup

订阅 RSS

0038906

歪酷博客

« 上一篇: 王者巴西! 下一篇: 结婚 »
高兴就好 @ 2004-07-27 08:58

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方法即可。

晕倒~~~!!排版可真累人

最新评论


zenithliu

2004-08-22 14:01

键盘事件是怎么被激发的呢?也就是想问:这个类和他的函数是怎么被调用得



zenithliu

2004-08-22 14:03

而且斑竹的代码编译不过去阿

to zenithliu
   键盘事件的捕获是从父类继承来的(这个类是JInternalFrame的子类)。setFocusTraversalPolicy方法只不过是把默认的DefaultFocusTraversalPolicy换成自定义的FocusTraversalPolicy
   编译不过去就试试用1.4.2_03吧。我用这个编译没问题

评论 / 个人网页 / 扔小纸条
*昵称

已经注册过? 请登录

Email
网址
*评论