GXT菜单对齐不正确

时间:2014-03-04 13:45:22

标签: java javascript gwt alignment gxt

我的GXT菜单(com.extjs.gxt.ui.client.widget.menu)存在奇怪的对齐问题。只有当scorllbar可见时,它才能正确地与MenuBarItem(也是com.extjs.gxt.ui.client.widget.menu)正确对齐。您可以在下面的图片中看到两个案例(Chrome 33):

no scrollbar with scrollbar

在自定义类MenuBarImpl的expand事件中调用对齐,扩展MenuBar

public class MenuBarImpl extends MenuBar implements IMenuBarImpl {
  (...)
  @Override
  protected void expand(MenuBarItem menuBarItem, boolean selectFirst) {
    MenuBarItemImpl item = (MenuBarItemImpl) menuBarItem;
    (...)
    item.getMenu().show(item.getElement(), "tl-bl?", new int[] {1, 0});
    (...)
  }
  (...)
}

调试时我发现问题似乎是JavaScript函数getAbsoluteLeft()(com.google.gwt.dom.client.DomImpl)。令我惊讶的是,它为两个场景返回相同的左坐标:当滚动条可见时和不存在时。看它的短体(见下文),它构建了2个DOM属性offsetLeft和offsetParent的值。因此,我使用Chrome开发者工具检查了这两种情况的值。值很好 - 它们应该为getAbsoluteLeft()函数的调用产生不同的结果。

public native int getAbsoluteLeft(Element elem) {
  var left = 0;
  var curr = elem;
  // This intentionally excludes body which has a null offsetParent.    
  while (curr.offsetParent) {
    left -= curr.scrollLeft;
    curr = curr.parentNode;
  }
  while (elem) {
    left += elem.offsetLeft;
    elem = elem.offsetParent;
  }
  return left;
}

我特别感到困惑的是,当滚动条可见而不是滚动条时,结果是正确的。有谁知道解决它的方法吗?

0 个答案:

没有答案