2016-06-29 93 views
0

我有一個TableViewer多列,其中一些列有工具提示,有些列沒有工具提示。工具提示的支持是通過JFace TableViewer上的本機工具提示無法正常工作

ColumnViewerToolTipSupport.enableFor(tableViewer); 

啓用每一列都具有分配其​​方法或者返回null(無提示)一個CellLabelProvider或工具提示文本。

所有列使用原生工具使用,即各自的useNativeToolTip()實現返回true

儘管所有這些工作一見如故,但將鼠標指針從沒有工具提示的列移動到具有工具提示的列時存在缺陷:後一列未顯示其工具提示。

碲描述的行爲可以至少在Windows 7

回答

0

解決辦法是,生成使用MouseMoveMouseHover聽衆從當前小區更新基礎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); 
    } 
}