2012-03-14 78 views
1

我正在使用GWT 2.4。我有一個Suggestbox,在某些情況下,我有要求隱藏建議列表。上下文如下。如何隱藏GWT SuggestBox中的建議?

用戶從建議列表中選擇一個建議後,我填充兩個其他文本框字段,其值與選擇對應。例如,假設promptbox包含用戶名,用戶從建議中選擇一個用戶名,然後選擇其他兩個字段,比如說用戶地址和電子郵件被填充到另外兩個文本框中。這兩個字段現在是只讀。然後用戶點擊「編輯」按鈕。現在用戶可以編輯用戶名(即在建議框中編輯),用戶地址和電子郵件。在用戶編輯用戶名時再次顯示建議是沒有意義的,因爲用戶已經選擇了用戶並決定對其進行編輯。簡而言之,我的SuggesBox應該像普通的文本框一樣工作。我試過下面的代碼,(我知道hideSuggestionList()被棄用),但它不工作。

display.getSuggestBox().hideSuggestionList(); 

閱讀hideSuggestionList的Javadoc()據說, 「已過時。使用DefaultSuggestionDisplay.hideSuggestions(),而不是」。我不知道如何使用DefaultSuggestionDisplay,並且我正在使用帶有「MultiWordSuggestOracle」的SuggestBox。

感謝您的幫助!

回答

3

你可以做的只是在用戶點擊編輯時將SuggestionBox與普通的TextBox交換,而在編輯關閉時返回。另外,因爲如果您將隱藏建議列表,它仍然從服務器查詢。通過交換小部件,您不必關心副作用。 SuggestionBox本身也使用一個TextBox,因此對於用戶來說它不可見,該小部件已經改變。

+0

嗨Hibrand,非常感謝你的解決方案。它像夢一樣工作。而且變化很小。我仍然認爲這是一種'解決'的問題。應該有一些方法來禁用/啓用顯示建議列表。 :) – hashcoder 2012-03-17 19:15:03

1

下面是解

我的入口點類

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

1

如果你不使用你自己的SuggestionDisplay,那麼這應該只是工作™:

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