Перемещение фокуса из JTextArea с помощью клавиши табуляции - PullRequest
29 голосов
/ 08 февраля 2009

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

1 Ответ

25 голосов
/ 08 февраля 2009

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

<code>/**
 * 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>
 * 
* Это должно сработать. * На этот раз используются сочетания клавиш. * Более элегантное решение, чем TabTransfersFocus (). * * @author kaimu * @since 2006-05-14 * @version 1.0 * / открытый класс TransferFocus { / ** * Патч поведения компонента. * TAB переводит фокус на следующий фокусируемый компонент, * SHIFT + TAB переводит фокус на предыдущий фокусируемый компонент. * * @param c Компонент, который будет исправлен. * / публичный статический void patch (Компонент c) { Set штрихи = новый HashSet (Arrays.asList (KeyStroke.getKeyStroke ("нажатая вкладка"))); c.setFocusTraversalKeys (KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, штрихи); обводки = новый HashSet (Arrays.asList (KeyStroke.getKeyStroke ("нажатие клавиши TAB"))); c.setFocusTraversalKeys (KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, штрихи); } }

Обратите внимание, что 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(); могло бы быть тем, что вы упустили, чтобы заставить его работать в вашем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...