2011-02-18 4 views
2

GWT에서 SuggestBox의 동작을 변경하고 싶습니다. ENTER 키를 눌러 값을 제출하고 싶습니다. 그러나 SuggestBox에는 KeyHandler가 있습니다. KeyHandler는 Enter 키를 잡아서 새 Selection을 설정합니다. 이 핸들러를 제거/초과하는 솔루션을 찾고 있습니다.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를 사용하여 상자에서이 핸들러를 제거 할 수 있습니까? 클래스를 확장하고 private 메소드를 재정 의하여 좋은 해결책이 있습니까?

답변

0

불행히도 메서드는 비공개이므로 원본을 직접 복사하고 메서드를 변경하면 메서드를 재정의 할 수 있습니다. 가장 좋은 방법은 SuggestBox의 인스턴스를 만들고 이벤트/처리기 동작을 재정의 할 수있는 TextBoxBase의 사용자 지정 구현을 전달하는 것입니다. addEventsToTextBox()는 해당 내부 클래스를 addEventsToTextBox()으로 호출하기 전에 생성자에서 설정 한 box 멤버 변수에 연결합니다. 이 경우에 이상적인 솔루션되지 않을 수도 있습니다

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

특정 상황에 따라하십시오 SuggestBox의 인스턴스와 함께 사용 후

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

과 : 다음과 같은

뭔가 사용법을 보여주는 코드 스 니펫을 보는 것이 도움이 될 것입니다.

편집 :

나는 당신이 아마 실제로는 기본 텍스트 입력 기능을 다시 구현하지 않아도 직접 때문에 같은 TextBox 또는 TextArea하지 TextBoxBase로 TextBoxBase의 서브 클래스를 확장 할 것을 언급해야한다 그 위젯 중.

관련 문제