简体   繁体   中英

Retrieving current user entered value from GWT SuggestBox

I'm new to GWT. I have a simple SuggestBox which is populated using a MultiWordSuggestOracle . Users input their data to this SuggestBox, and if they find any match with the existing Suggestions its well and good. I'm able to retrieve this value in the SelectionHandler code as below.

    display.getSuggestBox().addSelectionHandler(new SelectionHandler<Suggestion>() {

        public void onSelection(SelectionEvent<Suggestion> event) {

            String selectedProperty =   ((SuggestBox)event.getSource()).getValue();
            // do something with the property value
        }
    });

But users are allowed to enter values which are not already in the Suggestion oracle, in which case I should read this value and do something with this,may be saving to db as a new data.(The thing which I'm looking for is something like a browsers navigation widget where we show suggestions, users can pick up any suggestion or he can type in his new entry and carry on.) What I needed is a way to retrieve this new text user has entered? Data will be read on a button click. What I tried out is this.

    display.getSaveBtn().addClickHandler(new ClickHandler() {

        public void onClick(ClickEvent event) {


                String selectedProperty = display.getSuggestBox().getValue();
                //String selectedProperty2 = display.getSuggestBox().getText();

    // Blank in both cases :(
    // tried display.getSuggestBox().getTextBox().getValue(),but blank again

        }

    });

I tried to employ onChange() event handlers (as shown below)

    display.getSuggestBox().addValueChangeHandler(new ValueChangeHandler<String>() {

        public void onValueChange(ValueChangeEvent<String> event) {
            String selectedProperty = ((SuggestBox)event.getSource()).getValue();
            Window.alert("on change -- "+selectedProperty);

        }
    });

This is working fine except one scenario. Suppose there are two suggestions in the oracle,say 'createTicketWsdl' and 'createTicketTimeout'. When the user types in 'cr' , he is opted with these two options, and if he selects 'createTicketWsdl' by pressing keyboard ENTER , then my alert is printing 'createTicketWsdl' which is correct. But if he selects 'createTicketWsdl' using mouse , then my alert is printing 'cr' (I tried to post the screenshot to give a better understanding, but being a new user I'm not allowed).(which I wanted to get as 'createTicketWsdl'since thats what he has selected). Soon after printing my alert, the value in the SuggestBox changes to 'createTicketWsdl'.

Is there a way to retrieve the value of the suggest box? I saw a similiar thread GWT SuggestBox + ListBox Widget , where some source code for a custom widget is available. But I didn't take the pain of trying out that, since what I want is simply get the current value from the SuggestBox and I hope there should be some easy way.

Thanks for all your help!

Your question is not very clear. You need to clarify your language a lil' bit. For example - is the following a question or an assertion? I mean, it sounds like an assertion but it has a question mark.

What I needed is a way to retrieve this new text user has entered?

Also, I do not understand what you mean by " he is opted by ". Did you mean to say, " he is presented with the options ... " ?

Therefore, I am guessing your situation.

  1. You have a listbox of existing items.

  2. You have a textbox which allows freeform text entry

  3. Any items whose prefix values matches the current textbox entry, the listbox items would be filtered to be limited to the matching items.

  4. Even if the current textbox entry presents matching prefixes to filtering the listbox, the user can still perform freeform text entry. So, there are two possible cases here

    4.1 the user clicks on the list box to select one of the filtered items

    4.2 the user press enter key, which triggers selection of the current value of the textbox.

However, you find your widget participating in a race condition, so that when you click on the widget, the ValueChangeHandler gets triggered rather than the SelectionHandler. I do not know the structure of your widget so that is my best guess.

The problem is that you are allowing two separate modes of obtaining an outcome and you probably did not have well-defined state machine to handle choosing the appropriate mode. One mode is by the textbox and the other is by selection on the listbox - and you do not have a well-defined way of which would mode would be effective at any moment.

If my guess is accurate, this is what you need to do:

  • You must restrict your outcome to coming from only the textbox.

  • Your listbox selection must not trigger any outcome. Any change in listbox selection must propagate back to the textbox - to allow the user the chance of making further freeform entry based on that value.

  • only the keyboard enter on the textbox will trigger the final outcome.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM