2016-06-29 95 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); 
    } 
}