2016-06-29 3 views
0

TableViewer에는 툴팁이있는 열과 툴팁이없는 열이 여러 개 있습니다. 도움말 지원은 각 열은 그 어느 방법 getToolTipText()null (더 툴팁) 반환 할당 CellLabelProvider 또는 툴팁 텍스트가JFace의 네이티브 툴팁이 완벽하게 작동하지 않습니다.

ColumnViewerToolTipSupport.enableFor(tableViewer); 

통해 활성화된다.

모든 열은 네이티브 툴팁을 사용합니다. 즉 useNativeToolTip() 개의 구현은 true을 반환합니다.

처음에는이 모든 것이 작동하지만 마우스 포인터를 도구 설명이없는 열에서 도구 설명이있는 열로 옮길 때 결함이 있습니다. 후자의 열은 도구 설명을 표시하지 않습니다. 테 행동을 설명

적어도 윈도우 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); 
    } 
}