2016-06-29 21 views
0

私はTableViewerに複数の列があり、いくつかの列にはツールチップがあり、ないものもあります。ツールチップ支持体は、各列がその​​方法のいずれかnull(NOツールチップ)、またはツールチップテキストを返す割り当てCellLabelProviderを有するJFaceのネイティブツールチップが完璧に機能していません

ColumnViewerToolTipSupport.enableFor(tableViewer); 

によって有効にされます。

すべての列はネイティブツールチップを使用します。つまり、それぞれuseNativeToolTip()の実装はtrueを返します。

これはすべて最初のところで機能しますが、マウスポインタをツールチップなしの列からツールチップを持つ列に移動すると欠陥があります。後者の列にはツールチップが表示されません。 Teは動作を説明

は、少なくともWindows 7の回避策は、現在のセルから上での基礎となるTableのツールチップを更新するMouseMoveMouseHoverリスナーを使用するカスタムツールチップのサポートを構築することです

答えて

0

に観察することができます。

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()にアクセスする必要があります。したがって、getViewerRow()を一般公開するTableViewer派生クラスが必要です。

public class ExtendedTableViewer extends TableViewer { 
    @Override 
    public ViewerRow getViewerRow(Point point) { 
    return super.getViewerRow(point); 
    } 
} 
関連する問題