2012-03-11 51 views
2

我是GWT新手。我有一个简单的SuggestBox,它使用MultiWordSuggestOracle进行填充。用户输入他们的数据到这个SuggestBox,如果他们发现任何匹配与现有的建议它的好和好。我能够在SelectionHandler代码中检索这个值,如下所示。从GWT SuggestBox检索当前用户输入的值

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

     public void onSelection(SelectionEvent<Suggestion> event) { 

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

但允许用户输入数值,尚未在建议预言,在这种情况下,我应该看到它的值,并做一些与此,也可以保存到数据库作为新的数据。(事情我正在寻找的是类似于浏览器导航小部件的地方,我们显示建议,用户可以拿起任何建议,或者他可以键入他的新条目并继续。)我需要的是一种检索此新文本用户的方法进入?数据将通过点击按钮读取。我试过的是这个。

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 

     } 

    }); 

我试图采用的onChange()的事件处理程序(如下所示)

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

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

     } 
    }); 

这是除了一个场景中工作的罚款。假设oracle中有两个建议,例如'createTicketWsdl'和'createTicketTimeout'。当用户输入'cr'时,他选择了这两个选项,如果他通过按下键盘ENTER选择'createTicketWsdl',那么我的警报正在打印'createTicketWsdl',这是正确的。但是,如果他选择'createTicketWsdl'使用鼠标,那么我的警报是打印'cr'(我试图张贴屏幕截图给一个更好的理解,但作为一个新用户,我不允许)。想成为'createTicketWsdl',因为他已经选择了它)。打印完警报后不久,SuggestBox中的值变为“createTicketWsdl”。

有没有办法检索建议框的值?我看到一个类似的线程GWT SuggestBox + ListBox Widget,其中一些自定义小部件的源代码可用。但是我没有尝试过这样的痛苦,因为我想要的仅仅是从SuggestBox获得当前值,我希望应该有一些简单的方法。

感谢您的帮助!

回答

1

你的问题不是很清楚。你需要澄清你的语言。例如 - 下面是一个问题还是一个断言?我的意思是,这听起来像一个断言,但它有一个问号。

我需要的是一种方法来检索这个新的文本用户输入?

此外,我不明白你的意思是“he is opted by”。你的意思是说,“he is presented with the options ...”?

因此,我猜你的情况。

  1. 你有一个现有项目的列表框。

  2. 你有一个文本框,允许自由文本输入

  3. 其前缀值当前文本条目匹配的任何项目,列表框项目将被过滤局限于相匹配的项目。

  4. 即使当前的文本框条目出现匹配的前缀以过滤列表框,用户仍然可以执行自由形式的文本输入。所以,这里有

    4.1两种可能的情况下,在列表框中的用户点击来选择经过滤项

    4.2用户按回车键,这将触发文本框的当前值的选择之一。

但是,你会发现你的widget参与竞争状态,这样当你点击窗口小部件,该ValueChangeHandler被触发,而不是SelectionHandler。我不知道你的小部件的结构,所以这是我最好的猜测。

问题是,您允许两种单独的模式获得结果,并且您可能没有定义良好的状态机来处理选择适当的模式。一种模式是在文本框中,另一种模式是在列表框中进行选择 - 而且您没有明确的模式,哪种模式在任何时候都会有效。

如果我的猜测是正确的,这是你需要做的:

  • 你必须限制你的结果,仅从文本框来。

  • 您的列表框选择不得触发任何结果。列表框选择中的任何更改都必须传播回文本框 - 以允许用户根据该值进行更自由形式的输入。

  • 只有在文本框中输入键盘才会触发最终结果。

+0

非常感谢Geek的快速响应,并对问题提出了意见。肯定会尝试改进。我没有时间对你的反应进行一些思考。肯定会看到这个,很快回来......(忙于其他一些官方工作)。再次感谢 – hashcoder 2012-03-13 12:06:54