在GWT VerticalPanel上注册KeyDownHandler

时间:2010-12-12 05:39:41

标签: gwt event-handling

我有一个gwt VerticalPanel类,我需要为它处理KeyDown事件。 我用来在我的类中实现键盘处理程序的方法是: 我补充说:

this.sinkEvents(Event.ONKEYDOWN);

到构造函数 然后我重写方法onBrowserEvent()来处理键向下事件。

 @Override 
public void onBrowserEvent(Event event) {
// TODO Auto-generated method stub
  super.onBrowserEvent(event);
  int type = DOM.eventGetType(event);
  switch (type) {
  case Event.ONKEYDOWN:
                        //call method to handle this keydown event
   onKeyDownEvent(event);
   break;
  default:
   return;

  }
 }

但是此方法不适用于此VerticalPanel类。当按下某个键时,不会触发KeyDown事件!

有一些特定的gwt小部件支持KeyDownHandler,比如Button等.VerticalPanel不是其中之一。所以我们需要在扩展VerticalPanel的类上注册KeyDownHandler。 你能提出一个想法或暗示吗?

感谢

1 个答案:

答案 0 :(得分:9)

您可以创建Composite来覆盖FocusPanelVerticalPanel。这样,您可以捕获FocusPanel所关注的所有关键事件。只需将所需方法委派给面板:

public void onModuleLoad() {
    ExtendedVerticalPanel panel = new ExtendedVerticalPanel();
    panel.add(new Label("some content"));
    panel.addKeyDownHandler(new KeyDownHandler() {

        @Override
        public void onKeyDown(KeyDownEvent event) {
            if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {
                Window.alert("enter hit");
            }
        }
    });
    RootPanel.get().add(panel);
}

private class ExtendedVerticalPanel extends Composite implements HasWidgets, HasAllKeyHandlers {

    private VerticalPanel fVerticalPanel;
    private FocusPanel fFocusPanel;

    public ExtendedVerticalPanel() {
        fVerticalPanel = new VerticalPanel();
        fFocusPanel = new FocusPanel();
        fFocusPanel.setWidget(fVerticalPanel);
        initWidget(fFocusPanel);
    }

    @Override
    public void add(Widget w) {
        fVerticalPanel.add(w);
    }

    @Override
    public void clear() {
        fVerticalPanel.clear();
    }

    @Override
    public Iterator<Widget> iterator() {
        return fVerticalPanel.iterator();
    }

    @Override
    public boolean remove(Widget w) {
        return fVerticalPanel.remove(w);
    }

    @Override
    public HandlerRegistration addKeyUpHandler(KeyUpHandler handler) {
        return fFocusPanel.addKeyUpHandler(handler);
    }

    @Override
    public HandlerRegistration addKeyDownHandler(KeyDownHandler handler) {
        return fFocusPanel.addKeyDownHandler(handler);
    }

    @Override
    public HandlerRegistration addKeyPressHandler(KeyPressHandler handler) {
        return fFocusPanel.addKeyPressHandler(handler);
    }
}

<强>更新

关于如何在按下箭头键时阻止浏览器滚动的问题。这里有一个适合我的小例子:

public void onModuleLoad() {
    ExtendedVerticalPanel panel = new ExtendedVerticalPanel();
    // make panel reeeeaally big
    panel.setHeight("3000px");
    panel.add(new TextBox());
    panel.addKeyDownHandler(new KeyDownHandler() {

        @Override
        public void onKeyDown(KeyDownEvent event) {
            if (event.getNativeKeyCode() == KeyCodes.KEY_DOWN) {
                Window.alert("down hit");
                event.preventDefault();
            }
        }
    });
    RootPanel.get().add(panel);
}

添加您需要的处理程序,并在浏览器不得处理的事件上调用preventDefault()

相关问题