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

我的实现不起作用(当我单击 myWidget 时,我没有收到 onFocus 调用)

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

1 回答 1

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()。

如果您有任何疑问,请询问!

于 2013-06-12T10:00:06.773 回答