我有一个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。 你能提出一个想法或暗示吗?
感谢
答案 0 :(得分:9)
您可以创建Composite
来覆盖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 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()
。