KeyListener получает "нажатие клавиши", прежде чем мой JTextField делает ..? - PullRequest
4 голосов
/ 01 февраля 2010

Я получил JTextField, и к этому полю я добавил Keylistener. Внутри метода keyPressed я прошу метод напечатать (System.out.println), что находится внутри JTextField .. Если я нажимаю букву, кажется, что Keylistener получает это нажатие клавиши до того, как обновлено .. Я должен нажать две буквы, чтобы увидеть первое ..

Все, что мне нужно сделать, это сделать каждую букву заглавной, когда они вводятся. Это я пытаюсь сделать, слушая каждую клавишу (я также слушаю клавишу ENTER по другим причинам), а затем сделать textfield.setText(textfield.getText().toUpperCase());

Ответы [ 3 ]

4 голосов
/ 01 февраля 2010

Используйте DocumentFilter , чтобы изменить текст по мере его поступления.

Не самый красивый источник, и он не на 100% правильный, просто показывает, как он работает. Смотри оригинал здесь

((AbstractDocument)textField.getDocument()).setDocumentFilter(new UppercaseDocumentFilter());

  class UppercaseDocumentFilter extends DocumentFilter {
        public void insertString(DocumentFilter.FilterBypass fb, int offset,
                                 String text, AttributeSet attr)
                throws BadLocationException {

            fb.insertString(offset, text.toUpperCase(), attr);
        }

        public void replace(DocumentFilter.FilterBypass fb, int offset, int length,
                            String text, AttributeSet attrs)
                throws BadLocationException {

            fb.replace(offset, length, text.toUpperCase(), attrs);
        }
    }
2 голосов
/ 02 февраля 2010

Я знаю, что не очень популярно отвечать на ваш собственный вопрос ... но я думаю, что нашел решение .. Вместо того, чтобы делать все прописные буквы в методе keyPressed, я делаю это в keyReleased:)

0 голосов
/ 01 февраля 2010

Попробуйте использовать базовый документ:

textfield.getDocument().addDocumentListener(yourListener);
...