Какой слушатель я должен использовать для JTextField в игре на машинке? - PullRequest
1 голос
/ 14 мая 2011

Вот моя ситуация: я занимаюсь разработкой 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.

1 Ответ

1 голос
/ 14 мая 2011

Вы можете попытаться определить свой код очистки текстового поля как Runnable и выполнить его с помощью SwingUtilities.html.invokeLater, чтобы обойти IllegalStateException.

...