在GWT VerticalPanel上注册KeyDownHandler [英] Register KeyDownHandler on GWT VerticalPanel

查看:86
本文介绍了在GWT VerticalPanel上注册KeyDownHandler的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个gwt的VerticalPanel类,我需要处理KeyDown事件。
我用于在我的类中实现键盘处理程序的方法是:
i add:

  this.sinkEvents (Event.ONKEYDOWN); 

构造函数
然后我覆盖方法onBrowserEvent()来处理key down事件。

  @Override 
public void onBrowserEvent(Event event){
// TODO自动生成的方法存根
super.onBrowserEvent(event);
int type = DOM.eventGetType(event);
switch(type){
case Event.ONKEYDOWN:
//调用方法来处理这个keydown事件
onKeyDownEvent(event);
break;
默认值:
return;

}
}

然而,这种方法不起作用对于这个VerticalPanel类。当我按一个键时,KeyDown事件被触发!



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



谢谢

解决方案

您可以创建一个复合,其中包含 FocusPanel VerticalPanel 。通过这种方式,您可以捕获所有关键事件,前提是 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实现HasWidgets,HasAllKeyHandlers {

private VerticalPanel fVerticalPanel;
私人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() 浏览器不能照顾的事件。


I have a gwt VerticalPanel class that i need to handel KeyDown events for it. the method i used to implement keyboard handler in my class is: i add :

this.sinkEvents(Event.ONKEYDOWN);

to constructor then i override method onBrowserEvent() to handle key down event.

 @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;

  }
 }

however this method doesn’t work for this VerticalPanel class.no KeyDown Event is fired when i press a key!

there are specific gwt widgets that support KeyDownHandler like Button etc..VerticalPanel is not one of them..so we need a work around to register a KeyDownHandler on a class extending VerticalPanel. can you suggest an idea or hint?

thanks

解决方案

You could create a Composite that wrappes a FocusPanel and a VerticalPanel. This way you can catch all key events provided the FocusPanel is focused. Simply delegate the needed methods to the panels:

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

UPDATE

Your question on how to prevent the browser from scrolling when the arrow keys are pressed. Here a small example that works for me:

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

Add the handlers you need and call preventDefault() on the events the browser must not take care of.

这篇关于在GWT VerticalPanel上注册KeyDownHandler的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆