Нужна помощь в проверке автозаполнения - PullRequest
2 голосов
/ 23 февраля 2012

В поисках автозаполнения в одну строку, я нашел код здесь и там и, наконец, использовал этот

public class AutoCompleteDocument extends PlainDocument {

    private final List<String> dictionary = new ArrayList<String>(); 
    private final JTextComponent jTextField;

    public AutoCompleteDocument(JTextComponent field, String[] aDictionary) {
        jTextField = field;
        dictionary.addAll(Arrays.asList(aDictionary));
    }

    @Override
    public void insertString(int offs, String str, AttributeSet a)
            throws BadLocationException {
        super.insertString(offs, str, a);
        String word = autoComplete(getText(0, getLength()));
        if (word != null) {
            super.insertString(offs + str.length(), word, a);
            jTextField.setCaretPosition(offs + str.length());
            jTextField.moveCaretPosition(getLength());
        }
    }

    public String autoComplete(String text) {
        for (Iterator<String> i = dictionary.iterator(); i.hasNext();) {
            String word = i.next();
            if (word.startsWith(text)) {
                return word.substring(text.length());
            }
        }
        return null;
    }  
}

Тогда я использую это как

autoCompleteDoc = new AutoCompleteDocument(myTextField,myDictionary);
myTextField.setDocument(autoCompleteDoc);

Все отлично работает.

Моя проблема заключается в следующем:

В myTextField есть прослушиватель actionPerformed, поэтому при нажатии клавиши ввода выполняется некоторая обработка.

К сожалению, мне хотелось бы, чтобы текст был «предложен» (выделен), когда я нажимаю клавишу ввода, он подтверждает предложение, поэтому я могу продолжать вводить текст и только тогда, когда текст не предлагается (без выделения), а затем нажимать клавишу ввода делает мою обработку.

Я просто застрял без понятия, с чего начать. Кто-нибудь может мне помочь?

1 Ответ

2 голосов
/ 23 февраля 2012

Я думаю, что ваши реализации для Document идут в правильном направлении +1, вы должны добавить AttributeSet и Caret в качестве параметров

Посмотрите, как Автозаполнение JComboBox / JTextField работает

...