Nebula Grid总是捕获鼠标滚轮事件

By | 2019年9月27日

Nebula Grid是一个第三方SWT控件,用于以Table和Tree形式显示数据,但是功能比JFace Table和Tree更强大些。

JFace Table 或 Tree在其不显示滚动条时,鼠标滚轮轮动外面控件的滚动条。

image

当JFace Table 或 Tree 显示滚动条时,鼠标滚轮滚动Table 或 Tree自己。

image

但是Nebula Grid在不显示滚动条时,不能滚动外面控件的滚动条,这个有点不太user friendly。解决这个问题的方法是:在滚动条不显示时,把它设置成disabled,这样就不会捕获鼠标滚轮事件,可以滚动外面控件的滚轮了。

public static void disableVerticalBarWhenInvisible(GridTableViewer gridTableViewer) {
    gridTableViewer.getGrid().addPaintListener(event -> {
      ScrollBar verticalBar = ((Grid) event.widget).getVerticalBar();
      if (verticalBar != null && verticalBar.isEnabled() ^ verticalBar.isVisible()) {
        verticalBar.setEnabled(verticalBar.isVisible());
      }
    });
  }

封装成了一个方法,方便使用。在每次paint时,检查滚动条enabled属性是否和visible属性一直,如果不一致,就修改enabled属性。