【发布时间】:2015-05-11 16:36:58
【问题描述】:
我将一些CTabItems 和Images 添加到CTabFolder:
CTabFolder tabFolder = new CTabFolder(someSection, SWT.BORDER);
ImageDescriptor deleteImageDesc = sharedImages.getImageDescriptor(ISharedImages.IMG_ETOOL_DELETE);
Image deleteImage = deleteImageDesc.createImage();
CTabItem tabItem = new CTabItem(tabFolder, SWT.NONE);
tabItem.setImage(deleteImage);
// add more tabs...
然后我想创建一个ToolTip,如果用户将鼠标移到deleteImage 上,它就会出现。
ToolTip deleteToolTip = new ToolTip(getShell(), SWT.BALOON);
deleteToolTip.setMessage("Delete");
tabFolder.addMouseTrackListener(new MouseTrackAdapter()
{
@Override
public void mouseHover(MouseEvent e)
{
toolTip.setLocation(tabFolder.toDisplay(e.x, e.y));
toolTip.setVisible(doesAnyOfTabImagesContainPoint(mousePosition));
}
});
要实现方法doesAnyOfTabImagesContainPoint,我需要确定每个deleteImage 的位置。因为CTabItem 不是Control 我不能使用方法toDisplay。我尝试通过手动确定deleteImage 相对于tabFolder 的位置来解决这个问题。这会有所帮助,因为MouseEvent 持有的鼠标位置也相对于tabFolder。
private boolean doesAnyOfTabImagesContainPoint(Point p)
{
for (CTabItem tabItem : tabFolder.getItems())
{
Image i = tabItem.getImage();
Rectangle tabItemBounds = tabItem.getBounds();
Rectangle imageBounds = i.getBounds();
imageBounds.x += tabItemBounds.x;
imageBounds.y += tabItemBounds.y;
if (imageBounds.contains(p))
return true;
}
return false;
}
正常工作的要求是i.getBounds() 返回的Rectangle 相对于tabItem 具有正确的位置。但是它返回的 (0, 0, 16, 16) 不可能是正确的。
解决此问题的一种肮脏方法是仅添加一些常量:
imageBounds.x += bsTabBounds.x + 4;
imageBounds.y += bsTabBounds.y + 3;
但我想知道是否有更好的方法。我正在尝试调查CTabFolder 如何定位选项卡的图像,但目前还没有成功。任何帮助,将不胜感激。提前致谢。
编辑: 出于测试目的,这是我从ISharedImages 获得的提取图像,已修改以查看其边框:
【问题讨论】:
-
对我的回答有任何反馈吗?
-
如果您的解决方案对我有用,我很高兴您感兴趣。抱歉耽搁了,我这周一直在度假。我在家测试了您的代码,看起来简化示例没有出现问题。但是我需要在实际应用中对此进行测试,以做出最终决定是否真的解决了问题。我会在星期一一上班就做。