本文介绍了JFace TableViewer上的本机工具提示无法正常工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a TableViewer with multiple columns where some columns have tooltips and some don't. Tooltip support is enabled through

ColumnViewerToolTipSupport.enableFor( tableViewer );

每列都有一个 CellLabelProvider code> getToolTipText()方法返回 null (无工具提示)或工具提示文本。

Each column has a CellLabelProvider assigned whose getToolTipText() method either returns null (no tooltip) or a tooltip text.

所有列都使用原生工具条,即相应的 useNativeToolTip()实现返回 true

All columns use native toolstips, i.e. the respective useNativeToolTip() implementations return true.

尽管所有这一切都起作用,但是当鼠标指针从没有工具提示的列移动到具有工具提示的列时,存在一个缺陷:后一列不显示其工具提示。

While all this works at first sight, there is a flaw when moving the mouse pointer from a column without a tooltip to a column with a tooltip: the latter column does not show its tooltip.

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

Te described behavior can at least be observed on Windows 7.

推荐答案

解决方法是构建使用 MouseMove MouseHover 监听器,使用当前单元格的on更新底层 Table 的工具提示。

The workaround is to build a custom tooltip support that uses MouseMove and MouseHover listeners to update the tooltip of the underlying Table with the on from the current cell.

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()可公开访问:

The above class needs to find out the cell at the current mouse position and therefore requires access to getViewerRow(). Hence, it requires a TableViewer-derived class that makes getViewerRow() publicly accessible:

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

这篇关于JFace TableViewer上的本机工具提示无法正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-19 03:29