Как отображать предложения в GWT SuggestBox только после ввода 2 символов?

Я пытаюсь сделать SuggestBox, показывающий предложения только после того, как были введены 2 символа. Моя идея состояла в том, чтобы скрыть предложения, когда длина текста равна 1, используя класс DefaultSuggestionDisplay. Я пытался прикрепить различные обработчики, такие как KeyPressHandler и KeyUpHandler, к самому SuggestionBox и его TextBox, но ни один из них не работал. Есть ли у вас какие-либо предложения"? :D


person AndreiXwe    schedule 03.06.2016    source источник
comment
Разве вы не можете просто сделать так, чтобы ваш SuggestOracle возвращал ответы только тогда, когда запрос достаточно длинный?   -  person Thomas Broyer    schedule 03.06.2016


Ответы (2)


Вы можете расширить DefaultSuggestionDisplay и переопределить метод showSuggestions:

public class MySuggestionDisplay extends DefaultSuggestionDisplay {
    @Override
    protected void showSuggestions(SuggestBox suggestBox, Collection<? extends Suggestion> suggestions, boolean isDisplayStringHTML, boolean isAutoSelectEnabled, SuggestionCallback callback) {
        if(suggestBox.getText().length() > 1)
            super.showSuggestions(suggestBox, suggestions, isDisplayStringHTML, isAutoSelectEnabled, callback);
    }
}

Вы должны передать свой новый дисплей конструктору SuggestBox:

public class MySuggestBox extends SuggestBox {
    public MySuggestBox() {
        super(
            new MySuggestOracle(),
            new TextBox(), 
            new MySuggestionDisplay());
    }
}

В этом конструкторе вы должны указать:

  • ваш собственный класс SuggestOracle (здесь он называется MySuggestOracle) - я полагаю, у вас есть один
  • TextBox - это виджет по умолчанию для ввода текста (вы можете указать свой, просто нужно реализовать HasText)
  • SuggestionDisplay - используйте тот, у которого переопределен метод showSuggestions.

Это полный рабочий пример кода, показывающий предложения по крайней мере для двух введенных символов:

import java.util.ArrayList;
import java.util.Collection;

import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.SuggestOracle;
import com.google.gwt.user.client.ui.SuggestOracle.Suggestion;
import com.google.gwt.user.client.ui.TextBox;

public class MySuggestBox extends SuggestBox {

    public MySuggestBox() {
        super(
            new SuggestOracle() {
                @Override
                public void requestSuggestions(Request request, Callback callback) {
                    ArrayList<Suggestion> suggestions = new ArrayList<Suggestion>();
                    suggestions.add(new MySuggestion("aaa"));
                    suggestions.add(new MySuggestion("bbb"));
                    suggestions.add(new MySuggestion("ccc"));
                    suggestions.add(new MySuggestion("ddd"));

                    Response response = new Response();
                    response.setSuggestions(suggestions);
                    callback.onSuggestionsReady(request, response);
                }
            }, 
            new TextBox(), 
            new MySuggestionDisplay());
    }

    public static class MySuggestionDisplay extends DefaultSuggestionDisplay {
        @Override
        protected void showSuggestions(SuggestBox suggestBox, Collection<? extends Suggestion> suggestions, boolean isDisplayStringHTML, boolean isAutoSelectEnabled, SuggestionCallback callback) {
            if(suggestBox.getText().length() > 1)
                super.showSuggestions(suggestBox, suggestions, isDisplayStringHTML, isAutoSelectEnabled, callback);
        }
    }

    public static class MySuggestion implements Suggestion {

        private String text;

        public MySuggestion(String text) {
            this.text = text;
        }

        @Override
        public String getDisplayString() {
            return text;
        }

        @Override
        public String getReplacementString() {
            return text;
        }
    }
}
person Adam    schedule 05.06.2016
comment
Я использовал другой вариант, но теперь он работает. Кроме того, когда вы вводите 2 символа, а затем удаляете последний, предложения по-прежнему отображаются для 2 символов, поэтому я добавил else super.hideSugesstions(); к if в MySuggestionDisplay. Большое спасибо! - person AndreiXwe; 06.06.2016

Вы можете расширить SuggestBox и переопределить метод showSuggestionList().

Добавление KeyUpHandler не работает, потому что вы добавляете другой KeyUpHandler, а не заменяете тот, который SuggestBox добавил в свой собственный TextBox.

РЕДАКТИРОВАТЬ:

@Override
showSuggestionList() {
    if (getTextBox().getValue().length() > 1) {
        super.showSuggestionList();
    }
}
person Andrei Volgin    schedule 03.06.2016
comment
спасибо за совет, но у меня проблема: gyazo.com/0e168c8f98ee61ce7b859d6002a1abc5 - person AndreiXwe; 04.06.2016
comment
Разве super.showSuggestionList() не решит эту проблему? Когда у вас более 1 персонажа, просто позвольте реализации по умолчанию сделать свою работу. - person Adam; 05.06.2016
comment
он по-прежнему показывает предложения, когда я набираю только один символ - person AndreiXwe; 05.06.2016
comment
все еще не работает, даже если я использую getValueBox вместо getTextBox (устарело) - person AndreiXwe; 06.06.2016