我正在实施一个扩展Composite
并实施Focusable
和HasFocusHandlers
的自定义小部件。
小部件在面板中包含两个小部件,我将其包装到FocusPanel
中,用于初始化小部件。我的构造函数看起来像这样:
public CustomBox() {
panel = new VerticalPanel();
...
panel.add(caption);
panel.add(icon);
...
focusPanel = new FocusPanel(panel);
initWidget(focusPanel);
}
我在焦点小组中委派Focusable
和HasFocusHandlers
的实施,例如:
@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键也可以按预期工作,但我的问题是我无法处理焦点事件,因为从未调用onFocus()
添加的处理程序的addFocusHandler()
方法。
我知道焦点正在改变,因为我跟随对象的焦点,用:focus
CSS选择器改变其样式。
为什么焦点处理程序从未被调用?
答案 0 :(得分:0)
处理焦点事件可能会非常棘手和变化无常。 GWT应该通过在需要时将隐藏的输入字段添加到FocusPanel DIV中来使这一切变得简单。以下是jQuery文档的摘录:
焦点事件在获得焦点时发送到元素。该事件隐含地适用于有限的一组元素,例如表单元素(< input>,< select>等)和链接(< a href>)。在最近的浏览器版本中,可以通过显式设置元素的tabindex属性来扩展事件以包括所有元素类型。元素可以通过键盘命令(例如Tab键)或通过鼠标单击元素来获得焦点。
我不知道你的问题的解决方案,但我的猜测是HTML / browser / dom相关的东西搞乱了事件处理。例如,caption
或icon
还是FocusPanel
?这可能会影响焦点事件如何冒泡。