2010-12-12 104 views
1

我有一個gwt VerticalPanel類,我需要爲它處理KeyDown事件。 我用來實現在我的課鍵盤處理方法是: 我補充一下:在GWT垂直面板上註冊KeyDownHandler

this.sinkEvents(Event.ONKEYDOWN); 

同構造函數 然後我重寫方法onBrowserEvent()來處理key down事件。

@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類。no KeyDown當我按下按鍵時會觸發事件!

有一些支持KeyDownHandler的特定gwt小部件,如Button等.VerticalPanel不是其中之一。因此,我們需要在擴展VerticalPanel的類上註冊KeyDownHandler。 你能提出一個想法或提示嗎?

感謝

回答

9

您可以創建一個Composite是wrappes一個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); 
    } 
} 

UPDATE

您如何防止瀏覽器當按下箭頭鍵滾動的問題。在這裏,對我的作品的一個小例子:

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

+0

是完美的解決方案。我事實上意識到FocusPanel是通過將我的VerticalPanel包裝到FocusPanel中的解決方案。但是,您的代碼非常優雅。我喜歡寫一個ExtendedVerticalPanel的想法。非常感謝! – othman 2010-12-14 04:18:03

+0

不客氣。 – z00bs 2010-12-14 06:30:11

+0

您好,我還有一個問題:當我爲我的ExtendedVerticalPanel註冊keyDownHandler並使用向上/向下鍵時,它將觸發瀏覽器窗口滾動條,同時觸發我面板的按鍵事件。這種行爲是不可接受的。我通過在KeyDownHandler.onKeyDown(KeyDownEvent事件)方法開始時調用event.stopPropagation()來嘗試修復。問題是,停止事件傳播禁用我的面板內的小部件,如TextBox等所有的關鍵事件..我怎樣才能防止瀏覽器窗口滾動滾動,而我的面板上使用鍵上/下?非常感謝。 – othman 2010-12-14 12:02:32