2013-06-11 4 views
1

Я создал свои собственные виджеты gwt, которые состоят из TextLabel и изображения. Мне нужно, чтобы этот виджет был настраиваемым. Я расширяю этот виджет от интерфейса hasFocusHandler, focusable и blurhandler. Ничего не работает. Я не получаю ни фокуса, ни размытия, когда я нажимаю на или вне виджета. Что мне делать?Как создать фокусируемый виджет

Мой код:

public class MyWidget extends ComplexPanel implements HasFocusHandlers, HasBlurHandlers, HasClickHandlers, Focusable{ 

    private Icon icon = new Icon(); 

    private TextNode text = new TextNode(""); 

    private static final FocusImpl impl = FocusImpl.getFocusImplForWidget(); 

    protected static FocusImpl getFocusImpl() { 
    return impl; 
    } 

    public HandlerRegistration addClickHandler(ClickHandler handler) { 
    return addDomHandler(handler, ClickEvent.getType()); 
    } 

    @Override 
    public HandlerRegistration addBlurHandler(BlurHandler handler) { 
    return addDomHandler(handler,BlurEvent.getType()); 
    } 

    @Override 
    public HandlerRegistration addFocusHandler(FocusHandler handler) { 
    return addDomHandler(handler, FocusEvent.getType()); 
    } 

    @Override 
    public void onBrowserEvent(Event event) { 
    switch (DOM.eventGetType(event)) { 
     case Event.ONCLICK: 
      if (isEnabled()) { 
       super.onBrowserEvent(event); 
      } 
      break; 
     default: 
      super.onBrowserEvent(event); 
      break; 
    } 
    } 

    public int getTabIndex() { 
    return impl.getTabIndex(getElement()); 
    } 

    @Override 
    public void setAccessKey(char key) { 
    DOM.setElementProperty(getElement(), "accessKey", "" + key); 
    } 

    @Override 
    public void setFocus(boolean focused) { 
    if (focused) { 
     impl.focus(getElement()); 
    } else { 
     impl.blur(getElement()); 
    } 
    }  

    @Override 
    public void setTabIndex(int index) { 
    impl.setTabIndex(getElement(), index); 
    } 

    @Override 
    protected void onAttach() { 
    super.onAttach(); 

    int tabIndex = getTabIndex(); 
    if (-1 == tabIndex) { 
     setTabIndex(0); 
    } 
    } 
} 

Моя реализация не работает (я не получаю вызов OnFocus, когда я нажимаю на MyWidget)

mywidget.addFocusHandler(new FocusHandler() 
{ 
    @Override 
    public void onFocus(FocusEvent event) { 
    //DO SOMETHING     
    }    
}); 

ответ

1

Мы должны иметь больше информации, потому что я пропустите некоторый код, например, где вы прикрепляете Icon и TextNode к DOM?

Я сделал один пример, и он работает для меня. Смотри:

@UiField Label labelText; 

public MyWidget(String text) { 
    super(); 
    //That is the key. Attach the widgets to the dom 
    setElement(uiBinder.createAndBindUi(this).getElement()); 
    labelText.setText(text); 
} 

Кроме того, вместо того, мои внутренние виджеты, объявленные в классе, я создал класс UiBinder. В основном:

<!DOCTYPE ui:UiBinder SYSTEM 'http://dl.google.com/gwt/DTD/xhtml.ent'> 
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder' 
    xmlns:g='urn:import:com.google.gwt.user.client.ui'> 
    <ui:style> 
    </ui:style> 

    <g:FlowPanel> 
    <g:Label ui:field="labelText"> 
    </g:Label>  
    </g:FlowPanel> 
</ui:UiBinder> 

В таком случае вы можете прикрепить свои виджеты к панели быстрее и легче. и в конструкторе сделать только setElement().

Если у вас есть сомнения, просто спросите!

Смежные вопросы