代码之家  ›  专栏  ›  技术社区  ›  Tag

使用tab键从JTextArea移动焦点

  •  32
  • Tag  · 技术社区  · 16 年前

    如前所述,我想在 JTextArea (这样它的行为就像 JTextField 或类似组件)

    这是活动动作

    private void diagInputKeyPressed(java.awt.event.KeyEvent evt) {
        if(evt.KEY_PRESSED == java.awt.event.KeyEvent.VK_TAB) {
            actionInput.transferFocus();
        }
    }
    

    这是听众

    diagInput.addKeyListener(new java.awt.event.KeyAdapter() {
        public void keyPressed(java.awt.event.KeyEvent evt) {
            diagInputKeyPressed(evt);
        }
    });
    

    我也试过evt.KEY_TYPED,但毫无乐趣。

    有什么想法吗?

    快速编辑:我也试过 requestFocus() 代替 transferFocus()

    1 回复  |  直到 13 年前
        1
  •  29
  •   Community Mohan Dere    8 年前

    根据 this class :

    /**
     * Some components treat tabulator (TAB key) in their own way.
     * Sometimes the tabulator is supposed to simply transfer the focus
     * to the next focusable component.
     * <br/>
     * Here s how to use this class to override the "component's default"
     * behavior:
     * <pre>
     * JTextArea  area  = new JTextArea(..);
     * <b>TransferFocus.patch( area );</b>
     * </pre>
     * This should do the trick. 
     * This time the KeyStrokes are used.
     * More elegant solution than TabTransfersFocus().
     * 
     * @author kaimu
     * @since 2006-05-14
     * @version 1.0
     */
    public class TransferFocus {
    
        /**
         * Patch the behaviour of a component. 
         * TAB transfers focus to the next focusable component,
         * SHIFT+TAB transfers focus to the previous focusable component.
         * 
         * @param c The component to be patched.
         */
        public static void patch(Component c) {
            Set<KeyStroke> 
            strokes = new HashSet<KeyStroke>(Arrays.asList(KeyStroke.getKeyStroke("pressed TAB")));
            c.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, strokes);
            strokes = new HashSet<KeyStroke>(Arrays.asList(KeyStroke.getKeyStroke("shift pressed TAB")));
            c.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, strokes);
        }
    }
    

    注意 patch() 可以更短,根据 Joshua Goldberg 在……里面 the comments ,因为目标是恢复被覆盖的默认行为 JTextArea :

    component.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERS‌​AL_KEYS, null);
    component.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERS‌​AL_KEYS, null);
    

    这是有疑问的“ How can I modify the behavior of the tab key in a JTextArea ? "


    这个 previous implementation 确实涉及a Listener 和a transferFocus() :

       /**
         * Override the behaviour so that TAB key transfers the focus
         * to the next focusable component.
         */
        @Override
        public void keyPressed(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_TAB) {
                System.out.println(e.getModifiers());
                if(e.getModifiers() > 0) a.transferFocusBackward();
                else a.transferFocus(); 
                e.consume();
            }
        }
    

    e.consume(); 这可能是你错过的,让它在你的情况下发挥作用。