Перемещение фокуса из JTextArea с помощью клавиши табуляции

Как уже говорилось, я хочу изменить поведение TAB по умолчанию в 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()


person Community    schedule 08.02.2009    source источник
comment
Очень похоже на stackoverflow.com/questions/5042429/   -  person Pops    schedule 21.04.2011


Ответы (1)


Согласно этого класса:

/**
 * 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() может быть еще короче, согласно Джошуа Голдбергу в комментарии, поскольку цель состоит в том, чтобы вернуть поведение по умолчанию, переопределенное JTextArea:

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

Это используется в вопросе "Как изменить поведение клавиши табуляции в JTextArea?"


предыдущая реализация действительно включала Listener, а 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(); могло быть тем, что вы упустили, чтобы заставить его работать в вашем случае.

person VonC    schedule 08.02.2009
comment
необходимо изменить на getKeyCode() и evt.consume() - evt.consume() избавился от символа табуляции, а использование getKeyCode() позволяет успешно перемещать фокус с помощью табуляции. Большое спасибо :) - person ; 08.02.2009
comment
Пожалуйста. Интересно, первая реализация (та, которая изменяет FocusTraversalKeys компонента) не является более чистой, хотя... - person VonC; 08.02.2009
comment
вау, хороший ответ, всегда такое же образцовое внимание к деталям :) - person Ric Tokyo; 09.02.2009
comment
patch может быть проще, так как вы хотите вернуть поведение по умолчанию, переопределяемое JTextArea. Всего 2 строки: component.setFocusTraversalKeys(KeyboardFocusManager.{FORWARD,BACKWARD}_TRAVERSAL_KEYS, null) См. stackoverflow.com/a/5043957/411282 - person Joshua Goldberg; 20.06.2014