JTextField: фокусировать следующий компонент, когда текстовое поле заполнено / autoskip / Auto-Tabbing - PullRequest
3 голосов
/ 27 января 2011

Я хочу реализовать autoskip с JTextField, но не знаю, каков наилучший способ сделать это.

Что такое автоскейп / автоматическое табулирование?Когда вы достигаете определенного предела длины текстового поля, вы автоматически переходите к следующему полю.(например, нажмите Tab, выделите следующий компонент). Или какое имя вы используете для этого поведения?

Я пробовал это:

JTextField.getDocument.addChangeListener(): сравнить длину и позицию каретки.кажется пригодным для использования, но я не могу отличить типизированный пользовательский ввод от вызовов на JTextField.setText(String).

Фокус не должен изменяться при изменении текста с помощью графического обновления.

Что делатьВы думаете, это лучший способ реализовать это?

Ответы [ 3 ]

3 голосов
/ 27 января 2011

Возможно, вы хотите добавить KeyListener вместо компонента. Вы все еще можете проверить длину и положение каретки, но он будет срабатывать только при нажатии / вводе клавиши.

Ваш код может выглядеть примерно так:

addKeyListener(new KeyAdapter(){
    public void keyTyped(KeyEvent e) {
        if (getText().length() >= MAX_LENGTH) {
            // Move the focus
        }
    }
});

Изменить в ответ на комментарий:
Я мог бы предложить использовать предложение @ camickr:

private DocumentListener myTabChangeListener;
@Override
public void setText(String text) {
    getDocument().removeDocumentListener(myTabChangeListener);
    super.setText(text);
    getDocument().addDocumentListener(myTabChangeListener);
}
1 голос
/ 27 января 2011

См. Текстовое поле Auto Tab .

Фокус не должен изменяться при изменении текста с помощью gui-refresh.

a) removeListener
b) setText
c) addListener

Редактировать:

Если вам не очень нравится концепция необходимости ChainDocumentFilter, то избавьтесь от всех ссылок на этот класс,Вы можете заменить вызов метода provideErrorFeedback () на Toolkit.beep (), если хотите.

0 голосов
/ 27 января 2011

В вашем слушателе создайте флаг isAPI, чтобы различить, вызывает ли он ваш код setText (). Установите флаг в true перед вызовом setText () и сбросьте его обратно после.

Когда это правда, ничего не делайте и перемещайте фокус в противоположном случае.

...