如下面这段代码,我共设置了6个TextField,一行2个共3行,每次点击Tab键,焦点一次从1-6顺序获得,但是现在我希望将焦点的顺序为1、3、5来获得,不知道怎么设置,我试验了很多方法都不行,主要以增加addKeyListener为主,但是不知道能不能屏蔽掉组件获取焦点的功能?
import java.awt.*;
import javax.swing.*;import java.awt.event.*;public class Test extends JFrame{ public Test(){
this.setLayout(new GridLayout(3,4));
for(int i = 1; i < 7; i++){
JTextField field = new JTextField();
this.add(new JLabel("Field " + i));
this.add(field, new FlowLayout());
}
}
public static void main(String[] args){
Test test = new Test();
test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
test.setSize(400, 100);
test.setVisible(true);
}
}

解决方案 »

  1.   

    将这些JTextField定义为一个成员变量数组,定义get方法 在监听器中根据数组下标判断是否获取焦点
      

  2.   

    这样应该就行了
    import java.awt.Component;
    import java.awt.Container;
    import java.awt.FlowLayout;
    import java.awt.FocusTraversalPolicy;
    import java.awt.GridLayout;import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JTextField;public class FTest extends JFrame { public FTest() {
    final JTextField[] field = new JTextField[6];
    this.setLayout(new GridLayout(3, 4));
    for (int i = 0; i < 6; i++) {
    field[i] = new JTextField();
    this.add(new JLabel("Field " + (i + 1)));
    this.add(field[i], new FlowLayout());
    }
    FocusTraversalPolicy p = new FocusTraversalPolicy() { @Override
    public Component getLastComponent(Container aContainer) {
    // TODO Auto-generated method stub
    return field[0];
    } @Override
    public Component getFirstComponent(Container aContainer) {
    // TODO Auto-generated method stub
    return field[6];
    } @Override
    public Component getDefaultComponent(Container aContainer) {
    // TODO Auto-generated method stub
    return field[0];
    } @Override
    public Component getComponentBefore(Container aContainer,
    Component aComponent) {
    // TODO Auto-generated method stub
    int i = 0;
    for (; i < 6; i++) {
    if (field[i] == aComponent)
    break;
    }
    if (i == 1)
    return field[4];
    else if(i==0)
    return field[5];
    else
    return field[i + 2];
    } @Override
    public Component getComponentAfter(Container aContainer,
    Component aComponent) {
    int i = 0;
    for (; i < 6; i++) {
    if (field[i] == aComponent)
    break;
    }
    if (i == 4)
    return field[1];
    else if (i == 5)
    return field[0];
    else
    return field[i + 2];
    }
    };
    this.setFocusTraversalPolicy(p);
    } public static void main(String[] args) {
    FTest test = new FTest();
    test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    test.setSize(400, 100);
    test.setVisible(true);
    }
    }