Create fake tooltips for items in a SWT table

本文介绍了一种在 SWT 库中实现表格项 Tooltips 的方法。通过创建 TooltipTable 和 TooltipTableListener 类,实现了鼠标悬停时显示提示信息,鼠标移出时隐藏提示的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1)

/**
* Table that provides fake tooltips for items in a SWT table
*/
public class TooltipTable extends Table {
private TooltipTableListener tableListener;

protected void checkSubclass() {
}

public TooltipTable(Composite parent, int style) {
super(parent, style);

//1)
setToolTipText("");

//2)
tableListener = new TooltipTableListener(this);
addListener(SWT.Dispose, tableListener);
addListener(SWT.KeyDown, tableListener);
addListener(SWT.MouseExit, tableListener); //Hide tootip
addListener(SWT.MouseDown, tableListener); //Hide tooltip
addListener(SWT.MouseHover, tableListener); //Show tooltip
}

/** Default tooltip extracted from TableItem, subclass may override it */
protected String getTooltip(TableItem item) {
return "Hint: " + item.getText();
}
}


2)

/**
* Show tooltip when mouse hover TableItem
* Hide tooltip when mouse out of TableItem and not in tooltip
*/
public class TooltipTableListener implements Listener {
private Shell tip;
private Label label;
private TooltipTable table;
private TooltipLabelListener labelListener;
//private String brokerName;
private TableItem item;

//It should > 0
private int delayToRemoveTip = 100;

//Remove tooltip when mouse out of the TableItem and not in tooltip
private boolean isRemoveTip = true;

public TooltipTableListener(TooltipTable table) {
this.table = table;
labelListener = new TooltipLabelListener();
}

public void handleEvent(Event event) {
switch (event.type) {
case SWT.Dispose:
case SWT.KeyDown:
case SWT.MouseDown:
case SWT.MouseExit:
isRemoveTip = true;
disposeTooltip();
break;
case SWT.MouseHover:
item = table.getItem(new Point(event.x, event.y));
createTooltip();
}
}

/**
* Hide tooltip when mouse out of TableItem
* Do it after some delay, if mouse go into tooltip, don't hide tooltip
*/
class ReleaseTipThread extends Thread {
public void run() {
try {
Thread.yield();
Thread.sleep(delayToRemoveTip);
} catch (Exception e) {
e.printStackTrace();
}

Display.getDefault().asyncExec(new Runnable() {
public void run() {
if (isRemoveTip && tip != null && !tip.isDisposed()) {
tip.dispose();
tip = null;
}
}
});
}
}

private void disposeTooltip() {
new ReleaseTipThread().start();
}

private void createTooltip() {
if (item == null) {
disposeTooltip();
return;
}
if (table.getTooltip(item) == null)
return;

if (tip == null || tip.isDisposed()) {
Shell shell = table.getShell();
Display display = table.getDisplay();

tip = new Shell(shell, SWT.ON_TOP | SWT.TOOL);
FillLayout layout = new FillLayout();
tip.setLayout(layout);

label = new Label(tip, SWT.NONE);
//label.setForeground(display.getSystemColor(SWT.COLOR_INFO_FOREGROUND));
//label.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
label.setForeground(display.getSystemColor(SWT.COLOR_WHITE));
label.setBackground(display.getSystemColor(SWT.COLOR_BLUE));
label.addListener(SWT.MouseDown, labelListener);
label.addListener(SWT.MouseHover, labelListener);
}
initTip();
}

private void initTip() {
label.setData("_TABLEITEM", item);
label.setText(table.getTooltip(item));
Point size = tip.computeSize(SWT.DEFAULT, SWT.DEFAULT);
Rectangle rect = item.getBounds(0);
Point pt = table.toDisplay(rect.x, rect.y);
tip.setBounds(pt.x, pt.y, size.x, size.y);
tip.setVisible(true);
}

/** If MouseHover in the tooltip label, don't remove the tooltip */
class TooltipLabelListener implements Listener {
public void handleEvent(Event event) {
Label label = (Label) event.widget;
if ((label == null) || label.isDisposed())
return;

switch (event.type) {
case SWT.MouseHover:
isRemoveTip = false;
break;
case SWT.MouseDown:
Event e = new Event();
e.item = (TableItem) label.getData("_TABLEITEM");
table.setSelection(new TableItem[] { (TableItem) e.item });
table.notifyListeners(SWT.Selection, e);

isRemoveTip = true;
disposeTooltip();
}
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值