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

Я использую GWT 2.4. У меня есть Suggestbox, и у меня есть требование скрыть список предложений в определенных случаях. Контекст ниже.

После того, как пользователь выбирает предложение из списка предложений, я заполняю два других текстовых поля значениями, соответствующими выбору. Например, предположим, что поле предложений содержит имена пользователей, и пользователь выбирает имя пользователя из предложений, а затем два других поля, скажем, адрес пользователя и адрес электронной почты, заполняются в двух других текстовых полях. Эти два поля теперь только для чтения. Затем пользователь нажимает кнопку «Изменить». Теперь пользователь может редактировать любое имя пользователя (например, редактировать в окне предложений), адрес пользователя и адрес электронной почты. Нет смысла снова показывать предложения, когда пользователь редактирует имя пользователя, поскольку пользователь уже выбрал пользователя и решил его изменить. Короче говоря, мой SuggesBox должен вести себя как обычное текстовое поле. Я пробовал следующий код (я знаю, что hideSuggestionList() устарел), но он не работает.

display.getSuggestBox().hideSuggestionList();

Читая javadoc для hideSuggestionList(), говорится, что «устарело. Вместо этого используйте DefaultSuggestionDisplay.hideSuggestions()». Я не знаю, как использовать DefaultSuggestionDisplay, и я использую SuggestBox с MultiWordSuggestOracle.

Спасибо, что выручили меня!!


person hashcoder    schedule 14.03.2012    source источник


Ответы (3)


Что вы можете сделать, так это просто поменять местами SuggestionBox с обычным TextBox, когда пользователь нажимает кнопку редактирования, и обратно, когда редактирование закрывается. Также потому, что если вы скроете список предложений, он все равно будет запрашиваться с сервера. При замене виджета вам не нужно беспокоиться о побочных эффектах. Сам SuggestionBox также использует TextBox, и поэтому для пользователя не видно, что виджет изменился.

person Hilbrand Bouwkamp    schedule 14.03.2012
comment
Привет Hibrand, Большое спасибо за решение. Это работало как сон. И с очень меньшими изменениями. Я все еще думаю, что это своего рода «обходной путь». Должен быть какой-то способ отключить/включить показ списка предложений. :) - person hashcoder; 17.03.2012

Если вы не используете свой собственный SuggestionDisplay, то это должно просто работать™:

((DefaultSuggestionDisplay) suggestBox.getSuggestionDisplay()).hideSuggestions();
person Thomas Broyer    schedule 29.08.2013

Вот решение

Мой класс точки входа

public class SuggestionEntryPoint implements EntryPoint {

    @Override
    public void onModuleLoad() {
        SuggestBoxWidget suggestBoxWidget = new SuggestBoxWidget();
        RootPanel rootPanel = RootPanel.get();
        suggestBoxWidget.createOracle();
        suggestBoxWidget.createWidgetAndShow(rootPanel);
        rootPanel.add(suggestBoxWidget);
        DOM.getElementById("loader").removeFromParent();
    }

}

А вот и мой виджет

public class SuggestBoxWidget extends Composite {

    private TextBox textSuggestBox = new TextBox();

    private SuggestBox suggestBox = null;

    DefaultSuggestionDisplay suggestionDisplay = new DefaultSuggestionDisplay();

    MultiWordSuggestOracle suggestOracle = new MultiWordSuggestOracle();

    private static SuggestBoxWidgetUiBinder uiBinder = GWT
        .create(SuggestBoxWidgetUiBinder.class);

    interface SuggestBoxWidgetUiBinder extends
        UiBinder<Widget, SuggestBoxWidget> {
    }

    public SuggestBoxWidget() {
        initWidget(uiBinder.createAndBindUi(this));     
    }

    public void registerEvents(){
        suggestBox.addKeyUpHandler(new KeyUpHandler() {
            @Override
            public void onKeyUp(KeyUpEvent event) {
                if(suggestBox.getText().equalsIgnoreCase("1")){                 
                    suggestionDisplay.hideSuggestions();
                }
            }
        });
    }

    public void createWidgetAndShow(HasWidgets container){
        suggestBox = new SuggestBox(suggestOracle,textSuggestBox,suggestionDisplay);
        container.clear();
        container.add(suggestBox);      
        registerEvents();
    }

    public void createOracle(){
        for(int i=1;i<=100;i++){
            suggestOracle.add(i+"");
        }
    }

}

На самом деле вам нужно создать SuggestBox с 3 параметрами для конструктора.

person Vijay Sarin    schedule 16.03.2012
comment
Привет! Большое спасибо за ваше время и разработку решения. Я попытался скопировать и вставить ваш код, но я получаю некоторую ошибку UiBinder, как показано ниже. Файл шаблона SuggestBoxWidget.ui.xml отсутствует (ожидается в com/ctl/qportal /dbutilweb/клиент/представление). Я еще не использовал UiBinder... Я попытаюсь реализовать это, когда у меня будет время. Прямо сейчас я воспользуюсь предложением @Hilbrand Bouwkamp. т.е. заменить SuggestBox на TextBox. (Я действительно тороплюсь :)) - person hashcoder; 17.03.2012
comment
Вам не нужно использовать UiBinder. Просто создайте TextBox и замените его на Suggest Box динамически, обратившись к TextBox к конструктору SuggestBox. Затем вы можете использовать класс DefaultSuggestionDisplay, чтобы обойти скрытие предложений... - person Vijay Sarin; 19.03.2012