Мгновенная обработка ввода текста в JTextField

355
20 апреля 2017, 15:26

Нужно, чтобы при вводе символа в JTextField мгновенно выполнялся код, замеряющий время ввода слова, важна каждая миллисекунда. Сейчас пытаюсь на главный JFrame повесить KeyListener, но думаю - это плохой способ, не синхронизированные потоки, все дела. Как можно узнать, что в поле ввели текст, как можно быстрее?

Answer 1

Нашёл решение, возможно не самое элегантное, но в моём случае сработало и полностью отвечает требованиям.

Создаём свой KeyListener содержащий интерфейс KeyListener:

private static class KListener implements KeyListener
{
    private String str = "";
    public void keyTyped(KeyEvent e) {}
    public void keyPressed(KeyEvent e) {
        int code = e.getKeyCode();
        if (e.getKeyCode() == KeyEvent.VK_BACK_SPACE)
            {if (!str.equals("")) str = str.substring(0, str.length() - 1);}
        else if (code != KeyEvent.VK_SHIFT && code != KeyEvent.VK_ALT &&
                 code != KeyEvent.VK_CAPS_LOCK && code != KeyEvent.VK_CONTROL &&
                 code != KeyEvent.VK_ENTER && code != KeyEvent.VK_TAB &&
                 code != KeyEvent.VK_WINDOWS && code != KeyEvent.VK_CONTEXT_MENU)
                     str += e.getKeyChar();
    }
    public void keyReleased(KeyEvent e) {}
}

Если нажимаем Backspace, то стираем последний символ, иначе добавляем символ введённый с клавиатуры в текст, если, конечно, это не функциональная клавиша (все функциональные клавиши проверять не стал, ибо не было нужды, да и так получилось немаленькое нагромождение в коде).

Осталось на наш JTextField повесить KeyListener:

textField.addKeyListener(new KListener(this));

Всё, теперь в переменной str будет храниться текст, который содержится и в JTextField и его можно обработать с минимальной задержкой.

Answer 2

если хочешь обрабатывать текст при вставке, стоит поиграться с этим:

((AbstractDocument)textComponent.getDocument()).setDocumentFilter(new DocumentFilter(){
@Override
public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException {
super.insertString(fb, offset, modifyString(string), attr);
}
@Override
public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
super.replace(fb, offset, length, modifyString(text), attrs);
}
});
READ ALSO
JSP в качестве контроллера - моветон?

JSP в качестве контроллера - моветон?

На сайте нашел пример где контроллером выступает сама JSP, насколько это плохо или наоборот хорошо? Каковы преимущества/недостатки такой реализации?

222
Как быстро удалить файл?

Как быстро удалить файл?

Пишу файловый менеджер и захотелось сделать все операции быстрееНачал с удаления

202
Android: неверное получение позиции в FragmentStatePagerAdapter

Android: неверное получение позиции в FragmentStatePagerAdapter

В вопросе TabLayout с отдельным классом на каждую вкладку без заголовков был предложен такой подход:

272
Как передать содержимое уведомления в Activity при открытом приложении?

Как передать содержимое уведомления в Activity при открытом приложении?

Здравствуйте, я могу передать содержимое уведомления в активити при нажатии на само уведомление через Intent, вызвав onNewIntent

234