2010-06-28 64 views
3

我正在實施一個自定義小部件,擴展了Composite並實施了FocusableHasFocusHandlersGWT FocusPanel,標籤鍵和焦點處理程序

該小部件在一個面板中包含兩個小部件,我將其包裝到FocusPanel中,用於初始化小部件。我的構造看起來就像這樣:

public CustomBox() { 
    panel = new VerticalPanel(); 
    ... 
    panel.add(caption); 
    panel.add(icon); 
    ... 
    focusPanel = new FocusPanel(panel); 
    initWidget(focusPanel); 
} 

我委託FocusableHasFocusHandlers的實施調焦面板,如:

@Override 
public void setFocus(boolean focused) { 
    focusPanel.setFocus(focused); 
} 

@Override 
public void setTabIndex(int index) { 
    focusPanel.setTabIndex(index);   
} 

@Override 
public HandlerRegistration addFocusHandler(FocusHandler handler) { 
    return focusPanel.addFocusHandler(handler); 
} 

此後,我可以用setFocus(true)設置任何焦點我的對象和setTabIndex()設置選項卡索引。 Tab鍵也按預期工作,但我的問題是我無法處理焦點事件,因爲addFocusHandler()添加的處理程序的方法不會被調用。

我知道焦點在改變,因爲我遵循了使用:focus CSS選擇器改變其風格的objets焦點。

爲什麼焦點處理程序從不調用?

回答

0

處理焦點事件可能會變得棘手和變幻莫測。 GWT應該通過在需要的時候在你的FocusPanel DIV中添加隱藏的輸入字段來讓你輕鬆實現。以下是jQuery文檔的摘錄:

焦點事件在獲得焦點時發送到元素。此事件隱式適用於有限的一組元素,如表單元素(<輸入>,<選擇>等)和鏈接(<和href >)。在最近的瀏覽器版本中,可以通過顯式設置元素的tabindex屬性來將事件擴展爲包含所有元素類型。一個元素可以通過鍵盤命令獲得焦點,例如Tab鍵,或者通過鼠標點擊元素。

我不知道你的問題的解決方案,但我的猜測是,非常HTML /瀏覽器/ DOM相關的東西搞亂事件處理。例如,是caption還是icon也可以是FocusPanel?這可能會影響焦點事件如何起泡。