2011-02-18 80 views
2

我想改變GWT中SuggestBox的行爲。我想按ENTER鍵提交值。然而,SuggestBox有一個KeyHandler,它捕獲任何回車鍵並設置一個新的選擇。我正在尋找解決方案來刪除/重寫此處理程序。如何覆蓋/刪除GWT小部件中的默認處理程序?

這種方法是通過構造函數SuggestBox稱爲

private void addEventsToTextBox() { 
class TextBoxEvents extends HandlesAllKeyEvents implements 
    ValueChangeHandler<String> { 

    public void onKeyDown(KeyDownEvent event) { 
    switch (event.getNativeKeyCode()) { 
     case KeyCodes.KEY_DOWN: 
     display.moveSelectionDown(); 
     break; 
     case KeyCodes.KEY_UP: 
     display.moveSelectionUp(); 
     break; 
     case KeyCodes.KEY_ENTER: 
     case KeyCodes.KEY_TAB: 
     Suggestion suggestion = display.getCurrentSelection(); 
     if (suggestion == null) { 
      display.hideSuggestions(); 
     } else { 
      setNewSelection(suggestion); 
     } 
     break; 
    } 
    delegateEvent(SuggestBox.this, event); 
    } 

    public void onKeyPress(KeyPressEvent event) { 
    delegateEvent(SuggestBox.this, event); 
    } 

    public void onKeyUp(KeyUpEvent event) { 
    // After every user key input, refresh the popup's suggestions. 
    refreshSuggestions(); 
    delegateEvent(SuggestBox.this, event); 
    } 

    public void onValueChange(ValueChangeEvent<String> event) { 
    delegateEvent(SuggestBox.this, event); 
    } 
} 

TextBoxEvents events = new TextBoxEvents(); 
events.addKeyHandlersTo(box); 
box.addValueChangeHandler(events); 

}

是否有可能通過使用HandlerRegistration刪除從盒子這個處理程序?有沒有什麼好的解決方案,通過擴展類和重寫私有方法?

回答

0

不幸的是,由於該方法是私人的,除非直接複製源代碼並更改方法,否則將無法覆蓋該方法。我認爲你最好的選擇是創建一個SuggestBox的實例並向它傳遞一個TextBoxBase的自定義實現,然後你可以重寫事件/處理器行爲。請注意,addEventsToTextBox()將該內部類掛鉤到調用addEventsToTextBox()之前在構造函數中設置的box成員變量。

也有類似以下內容:

public class MyTextBox extends TextBox{ 
... 
// Override the handlers/events 
... 
} 

,然後用你的一個SuggestBox的情況下使用它:

MyTextBox myBox = new MyTextBox(...); 
SuggestBox sBox = new SuggestBox(oracle, myBox); 

根據您的具體情況,這可能不是在這種情況下的理想解決方案看到一些代碼片段顯示您對它的使用會很有幫助。

編輯:

我要指出,你可能真的想延長TextBoxBase的子類,如TextBoxTextArea,而不是直接TextBoxBase,所以你不必重新實現基本的文字輸入功能這些小部件。

相關問題