如何隐藏GWT SuggestBox中的建议?

问题描述:

我正在使用GWT 2.4。我有一个Suggestbox,在某些情况下,我有要求隐藏建议列表。上下文如下。如何隐藏GWT SuggestBox中的建议?

用户从建议列表中选择一个建议后,我填充两个其他文本框字段,其值与选择对应。例如,假设promptbox包含用户名,用户从建议中选择一个用户名,然后选择其他两个字段,比如说用户地址和电子邮件被填充到另外两个文本框中。这两个字段现在是只读。然后用户点击“编辑”按钮。现在用户可以编辑用户名(即在建议框中编辑),用户地址和电子邮件。在用户编辑用户名时再次显示建议是没有意义的,因为用户已经选择了用户并决定对其进行编辑。简而言之,我的SuggesBox应该像普通的文本框一样工作。我试过下面的代码,(我知道hideSuggestionList()被弃用),但它不工作。

display.getSuggestBox().hideSuggestionList(); 

阅读hideSuggestionList的Javadoc()据说, “已过时。使用DefaultSuggestionDisplay.hideSuggestions(),而不是”。我不知道如何使用DefaultSuggestionDisplay,并且我正在使用带有“MultiWordSuggestOracle”的SuggestBox。

感谢您的帮助!

你可以做的只是在用户点击编辑时将SuggestionBox与普通的TextBox交换,而在编辑关闭时返回。另外,因为如果您将隐藏建议列表,它仍然从服务器查询。通过交换小部件,您不必关心副作用。 SuggestionBox本身也使用一个TextBox,因此对于用户来说它不可见,该小部件已经改变。

+0

嗨Hibrand,非常感谢你的解决方案。它像梦一样工作。而且变化很小。我仍然认为这是一种'解决'的问题。应该有一些方法来禁用/启用显示建议列表。 :) – hashcoder 2012-03-17 19:15:03

下面是解

我的入口点类

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(); 
    } 

} 

这里是我的Widget

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+""); 
     } 
    } 

} 

事实上,你必须创建具有3个参数的构造函数一个SuggestBox。

+0

嗨非常感谢您花费您的时间和解决方案..我尝试复制粘贴您的代码,但我得到一些UiBinder错误,如下所示“模板文件SuggestBoxWidget.ui.xml丢失(预计在COM/CTL/qportal/dbutilweb /客户端/视图)”。我还没有使用过UiBinder ...我会尽力在我有一些时间的时候实现它。现在我会和@Hilbrand Bouwkamp的建议一起去。即用TextBox替换SuggestBox。(我真的很着急:)) – hashcoder 2012-03-17 19:11:30

+0

你不必使用UiBinder。只需创建一个文本框,并通过将TextBox引用到SuggestBox构造函数来动态地将其替换为Suggest Box。然后,您可以使用DefaultSuggestionDisplay类来解决隐藏的建议... – 2012-03-19 04:47:45

如果你不使用你自己的SuggestionDisplay,那么这应该只是工作™:

((DefaultSuggestionDisplay) suggestBox.getSuggestionDisplay()).hideSuggestions();