Вот моя ситуация: я занимаюсь разработкой java-игры, и мне нужно найти лучшего слушателя для моего JTextField.
JTextField typeBox;
Слушатель должен быть в состоянии обнаружить ввод пользователя, отправитьтекст внутри поля для основной части игры для обработки, и если достигнут конец слова, поле типа ДОЛЖНО БЫТЬ ОЧИЩЕНО (чтобы пользователь мог вводить по одному слову за раз, как при обычном наборе текстаигры).Я пробовал KeyListener
public class TypeBoxListener implements KeyListener
{
@Override
public void keyPressed(KeyEvent arg0) {
}
@Override
public void keyReleased(KeyEvent arg0) {
if (arg0.getKeyChar() == arg0.CHAR_UNDEFINED) return;
String typedText = typeBox.getText();
thisGUI.processUserInput(typedText);
}
@Override
public void keyTyped(KeyEvent arg0) {
}
}
Проблема в том, что когда пользователь достигает конца слова, не отпуская клавишу, и сразу же набирает другой ключ, этот новый ключ теряется.
Я также попробовал DocumentListener
public class TypeBoxListener implements DocumentListener
{
@Override
public void changedUpdate(DocumentEvent arg0) {
}
@Override
public void insertUpdate(DocumentEvent arg0) {
String typedText = paragraphPanel.typeBox.getText();
thisGUI.processUserInput(typedText);
}
@Override
public void removeUpdate(DocumentEvent arg0) {
String typedText = paragraphPanel.typeBox.getText();
thisGUI.processUserInput(typedText);
}
}
Этот метод гораздо более адаптивный, чем использование keyReleased, однако я не могу очистить текстовое поле с помощью этого метода, потому что я получу исключение IllegalStateException, пытаясь изменить документ внутриDocumentListener.