使用Java Swing设计的JFrame,画面中有很多类型的控件,如JTextField, JComboBox, JButton, JCheckBox等,默认支持Tab键切换控件焦点,切换顺序按照控件所处位置从左到右,从上到下进行,现在我想修改这种默认设置,要求:
(1) 用Enter键代替Tab键执行控件焦点切换;
(2) 想自己定义控件焦点切换的顺序,即自己定义控件切换规则;
(3) 因为画面中我要控制有些情况下某些控件不可用,即setEnabled(false),所以切换焦点时,在(2)定义规则的前提下,可以自动跳过这些不可用的控件,切换到可用的控件,如何实现呢?用Tab键切换时就可以自动跳过那些不可用的控件,它是怎么实现的呢?高手能否指点一二,非常感谢!希望各位大虾能提出宝贵意见,本人不甚感激,并有分数送上!

解决方案 »

  1.   

    import java.awt.*;
    import java.awt.event.*;public class MyTextField extends TextField {
    MyTextField(int len) {
      super(len);
      addKeyListener(new KeyAdapter() {
       public void keyPressed(KeyEvent evt) {
        int key = evt.getKeyCode();
        if (key == KeyEvent.VK_ENTER)
         transferFocus();}});
      }
    }====================================
    看看好使吗?
      

  2.   

    你可以对你的控件按你的规则排好,当按下Enter时,现判断当前具有Foucs的控件,然后让焦点挪到下一个
      

  3.   

    For_suzhen(不懂装懂):
    我现在是用笨方法做的,非常麻烦,并且不通用,具体做法如下:
          if (e.getKeyCode() == KeyEvent.VK_ENTER) {
            if (e.getSource() == JTextField1) { //文本框1-->下拉框1
              JComboBox1.requestFocusInWindow();
            }
            else if (e.getSource() == JComboBox1.getEditor().getEditorComponent()) { //下拉框1-->按钮1
              JButton1.requestFocusInWindow();
            }
            else if (e.getSource() == JButton1) { //按钮1
              JCheckBox1.requestFocusInWindow();
            }
            ......
          }这种方法是不是太笨了?一点也不通用!你说的意思是不是就是这个?希望大家都来关注!
      

  4.   

    大家都没有遇到类似的问题吗?一起讨论解决呀!听说java图形设计:Swing的第4章第10节有介绍的,谁有这本书电子版?能否共享一下?非常感谢!
      

  5.   

    I need your help! Thanks a lot
      

  6.   

    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;import javax.swing.JComboBox;
    import javax.swing.JComponent;
    import javax.swing.JList;/**
     * 鼠标事件监听。监听回车和上下箭头。回车和下箭头到下一组件,上箭头到上一组件
     * 
     * @author marvy
     */
    public class ComponentFocusKeyAdapter extends KeyAdapter {    // 当前组件
        private JComponent currentFocusComponent = null;
        // 上一组件
        private JComponent preFocusComponent = null;
        // 下一组件
        private JComponent nextFocusComponent = null;    public ComponentFocusKeyAdapter() {        super();
        }    /**
         * 构造监听组件
         * 
         * @param preFocusComponent 上一组件
         * @param nextFocusComponent 下一组件
         */
        public ComponentFocusKeyAdapter(JComponent preFocusComponent,
            JComponent currentFocusComponent, JComponent nextFocusComponent) {        this.preFocusComponent = preFocusComponent;
            this.currentFocusComponent = currentFocusComponent;
            this.nextFocusComponent = nextFocusComponent;
        }    /**
         * 键释放操作
         * 
         * @see java.awt.event.KeyAdapter#keyReleased(java.awt.event.KeyEvent)
         */
        public void keyReleased(KeyEvent e) {        super.keyReleased(e);        // 下一个聚焦组件不为空
            if (nextFocusComponent != null) {
                // 回车
                if (e.getKeyCode() == 10) {
                    nextFocusComponent.requestFocus();
                    return;
                }            // 如果是下拉框或列表
                if (currentFocusComponent instanceof JComboBox
                    || currentFocusComponent instanceof JList) {
                    // 右箭头
                    if (e.getKeyCode() == 39) {
                        nextFocusComponent.requestFocus();
                        return;
                    }
                }            // 下箭头
                if (e.getKeyCode() == 40) {
                    nextFocusComponent.requestFocus();
                    return;
                }
            }        // 下一个聚焦组件不为空
            if (preFocusComponent != null) {
                // 如果是下拉框或列表
                if (currentFocusComponent instanceof JComboBox
                    || currentFocusComponent instanceof JList) {
                    // 左箭头
                    if (e.getKeyCode() == 37) {
                        preFocusComponent.requestFocus();
                        return;
                    }
                }            // 上箭头
                if (e.getKeyCode() == 38) {
                    preFocusComponent.requestFocus();
                    return;
                }
            }
        }    /**
         * @return nextFocusComponent。
         */
        public JComponent getNextFocusComponent() {        return this.nextFocusComponent;
        }    /**
         * @param nextFocusComponent nextFocusComponent。
         */
        public void setNextFocusComponent(JComponent nextFocusComponent) {        this.nextFocusComponent = nextFocusComponent;
        }    /**
         * @return preFocusComponent。
         */
        public JComponent getPreFocusComponent() {        return this.preFocusComponent;
        }    /**
         * @param preFocusComponent preFocusComponent。
         */
        public void setPreFocusComponent(JComponent preFocusComponent) {        this.preFocusComponent = preFocusComponent;
        }    /**
         * @return currentFocusComponent。
         */
        public JComponent getCurrentFocusComponent() {        return this.currentFocusComponent;
        }    /**
         * @param currentFocusComponent currentFocusComponent。
         */
        public void setCurrentFocusComponent(JComponent currentFocusComponent) {        this.currentFocusComponent = currentFocusComponent;
        }
    }
      

  7.   

    public class ComponentUtil {    private ComponentUtil() {    }
       /**
         * 设置焦点组件
         * 
         * @param component 焦点组件
         */
        public static void setFocusComponents(JComponent[] component) {        JComponent preComponent = null;
            JComponent currentComponent = null;
            JComponent nextComponent = null;
            for (int i = 0; i < component.length; i++) {
                currentComponent = component[i];            if (i > 0) {
                    preComponent = component[i - 1];
                }            if (i < component.length - 1) {
                    nextComponent = component[i + 1];
                }            if (i < component.length && component[i] != null) {
                    component[i].addKeyListener(new ComponentFocusKeyAdapter(
                        preComponent, currentComponent, nextComponent));
                }
            }
        }
    }
      

  8.   

    使用方法:
    ComponentUtil.setFocusComponents(new JComponent[] {....});
      

  9.   

    I'm trying. Thanks a lot!