JFace TableViewer上的原生工具提示无法正常工作

时间:2016-06-29 17:01:00

标签: eclipse jface

我有一个TableViewer多列,其中一些列有工具提示,有些则没有。工具提示支持通过

启用
ColumnViewerToolTipSupport.enableFor( tableViewer );

每列都分配了CellLabelProvider,其getToolTipText()方法返回null(无工具提示)或工具提示文字。

所有列都使用本机工具提示,即相应的useNativeToolTip()实现返回true

虽然所有这些都是第一眼看到的,但是将鼠标指针从没有工具提示的列移动到带有工具提示的列时会有一个缺陷:后一列没有显示其工具提示。

至少可以在Windows 7上观察到所描述的行为。

1 个答案:

答案 0 :(得分:0)

解决方法是构建自定义工具提示支持,该支持使用MouseMoveMouseHover侦听器使用当前单元格中的on更新基础Table的工具提示。

class NativeViewerToolTipSupport {

  private final ExtendedTableViewer tableViewer;
  private final Listener mouseListener;

  NativeViewerToolTipSupport( ExtendedTableViewer tableViewer ) {
    this.tableViewer = tableViewer;
    this.tableViewer.getTable().setToolTipText( "" );
    this.mouseListener = this::handleMouseEvent;
  }

  void install() {
    tableViewer.getTable().addListener( SWT.Dispose, event -> uninstall() );
    tableViewer.getTable().addListener( SWT.MouseMove, mouseListener );
    tableViewer.getTable().addListener( SWT.MouseHover, mouseListener );
  }

  void uninstall() {
    tableViewer.getTable().removeListener( SWT.MouseMove, mouseListener );
    tableViewer.getTable().removeListener( SWT.MouseHover, mouseListener );
  }

  private void handleMouseEvent( Event event ) {
    String toolTipText = getToolTipText( event );
    if( !Objects.equals( tableViewer.getTable().getToolTipText(), toolTipText ) ) {
      tableViewer.getControl().setToolTipText( toolTipText );
    }
  }

  private String getToolTipText( Event event ) {
    String result = "";
    Point point = new Point( event.x, event.y );
    ViewerRow row = tableViewer.getViewerRow( point );
    if( row != null ) {
      ViewerCell cell = row.getCell( point );
      if( cell != null ) {
        CellLabelProvider labelProvider = tableViewer.getLabelProvider( cell.getColumnIndex() );
        if( labelProvider != null ) {
          result = labelProvider.getToolTipText( cell.getElement() );
        }
      }
    }
    return result;
  }

}

上述类需要找出当前鼠标位置的单元格,因此需要访问getViewerRow()。因此,它需要一个TableViewer派生类,使getViewerRow()可公开访问:

public class ExtendedTableViewer extends TableViewer {
  @Override
  public ViewerRow getViewerRow( Point point ) {
    return super.getViewerRow( point );
  }
}