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