Moving focus from JTextArea using tab key

前端 未结 1 1917
旧巷少年郎
旧巷少年郎 2020-12-13 13:51

As stated, I want to change the default TAB behaviour within a JTextArea (so that it acts like a JTextField or similar component)

Here\'s t

1条回答
  •  心在旅途
    2020-12-13 14:37

    According to 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.
     * 
    * Here s how to use this class to override the "component's default" * behavior: *
     * JTextArea  area  = new JTextArea(..);
     * TransferFocus.patch( area );
     * 
    * 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 strokes = new HashSet(Arrays.asList(KeyStroke.getKeyStroke("pressed TAB"))); c.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, strokes); strokes = new HashSet(Arrays.asList(KeyStroke.getKeyStroke("shift pressed TAB"))); c.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, strokes); } }

    Note that patch() can be even shorter, according to Joshua Goldberg in the comments, since the goal is to get back default behaviors overridden by JTextArea:

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

    This is used in question "How can I modify the behavior of the tab key in a JTextArea?"


    The previous implementation involved indeed a Listener, and the 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(); might have been what you missed to make it work in your case.

    0 讨论(0)
提交回复
热议问题