2010-06-28 38 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?这可能会影响焦点事件如何起泡。