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