我在写一些控件,在焦点移动碰到问题:当我按上下键或tab键移动焦点,我怎么才知道下一个应该获得焦点的控件是哪个?

解决方案 »

  1.   

    设置一个临时变量存储当前焦点控件对象
    让每个控件获得焦点的时候,
    if 当前临时变量 is not null and 当前临时变量 不得与自己
    当前临时变量.focus();
    这个时候就知道下个焦点的控件是谁了,然后
    当前临时变量设置为null
    同时下个焦点.focus();
    大概意思是这样,需要细调下方案2:
    可以设置每个控件的index吧。你只要在init里面绑定所有的index和控件对象即可
    推荐方案2
      

  2.   

    搞那么高深干什么onfocus()事件alert出来元素的name不就行了?
      

  3.   

    1楼的第二种方案确实有道理,但是index怎么与component绑定?
    而且像j2se焦点的转移是跟位置有关,最左上角的控件先获得焦点,然后往右跑,再往下跑,并不是添加控件的顺序。我自己的想法是:
    在每个Container里面有一个控件列表和一个引用focusedComponent指向当前获得焦点的控件,当这个容器获得方向键的事件,则判断focusedComponent是否为null,以及移动的方向,然后改变focusedComponent的值。但问题是,当容器获得方向键的事件,即移动焦点,并且focusedComponent为null时,并不知道焦点从哪个方向来,因为方向键的向上和向下键
    可以改变焦点移动的方向。
      

  4.   

    tabindex这个是html的一个属性,可以控制tab键的切换顺序,自己goolge it.
      

  5.   

    如果你只是想让上下键能改变焦点的话,可以用Component 类的public void setFocusTraversalKeys(int id, Set<? extends AWTKeyStroke> keystrokes) 方法import java.awt.BorderLayout;
    import java.awt.GridLayout;
    import java.awt.KeyboardFocusManager;
    import java.util.HashSet;
    import java.util.Set;import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.KeyStroke;public class T {
    public static void main(String[] args)
    {
    JPanel p = new JPanel(new GridLayout(3,3,5,5));
    for (int i = 0; i < 9; i++) {
    p.add(new JButton("Button-" + (i+1)));
    }

    Set<KeyStroke> forwardKeys = new HashSet<KeyStroke>();
    Set<KeyStroke> backwardKeys = new HashSet<KeyStroke>();

    forwardKeys.add(KeyStroke.getKeyStroke("DOWN"));
    forwardKeys.add(KeyStroke.getKeyStroke("TAB"));
    forwardKeys.add(KeyStroke.getKeyStroke("ctrl TAB"));

    backwardKeys.add(KeyStroke.getKeyStroke("UP"));
    backwardKeys.add(KeyStroke.getKeyStroke("shift TAB"));
    backwardKeys.add(KeyStroke.getKeyStroke("ctrl shift TAB"));

    p.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, forwardKeys);
    p.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, backwardKeys);

    JFrame f = new JFrame();
    f.getContentPane().add(p, BorderLayout.CENTER);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
    }
    }
      

  6.   

    可能大家都误解了我的意思。我是在j2me上用其Canvas来绘制控件。这些控件完全是自己写,没有j2me中ui的任何支持,除了paint和事件,完完全全是基本语法一句一句敲出来的。现在我抽象出几个类:Component、Container、Frame,每个Component有isFocusable和isFocusing,
    让Container去管理focuse属于谁,而就是这个管理出现了问题。
      

  7.   

    我用j2me写过一个抛雷的,用canvas写的,我的实现很简单,生成6x6的格子,光标出始化位置在(x=1.y=1),当你按上下左右时,x,y随着++,--,当x=3,y=4时,说明光标在第三行,第四列的位置上。
    具体实现如下:
    http://blog.csdn.net/hl_ghost/archive/2008/09/20/2955645.aspx
    应该可以运行的