在GWT VerticalPanel上注册KeyDownHandler [英] Register KeyDownHandler on GWT VerticalPanel
问题描述
我用于在我的类中实现键盘处理程序的方法是:
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屋!