问题描述
我有一个具有多个列的 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上的本机工具提示无法正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!