Как определить правильное положение изображения внутри CTabItem
Я добавляю некоторые CTabItem
с Image
с 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;
}
Требование для правильной работы это то, что Rectangle
вернулся i.getBounds()
имеет правильное расположение относительно tabItem
, Однако это возвращает (0, 0, 16, 16)
что не может быть правильным.
Грязный способ исправить это - добавить несколько констант:
imageBounds.x += bsTabBounds.x + 4;
imageBounds.y += bsTabBounds.y + 3;
Но мне интересно, есть ли лучший способ. Я пытаюсь выяснить, как CTabFolder
позиционирует изображения вкладок, но пока безуспешно. Любая помощь будет оценена. Заранее спасибо.
редактировать: для тестирования вот извлеченное изображение, которое я получаю ISharedImages
изменено, чтобы увидеть его границу:
1 ответ
Дайте код ниже снимка. Это основано на моем ответе здесь.
public static void main(String[] args)
{
Display display = Display.getDefault();
final Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
final TabFolder folder = new TabFolder(shell, SWT.NONE);
TabItem item = new TabItem(folder, SWT.NONE);
item.setImage(display.getSystemImage(SWT.ICON_ERROR));
item.setText("Text");
folder.addListener(SWT.MouseMove, event -> {
TabFolder curFolder = (TabFolder) event.widget;
Point eventLocation = new Point(event.x, event.y);
TabItem theItem = curFolder.getItem(eventLocation);
if (theItem == null)
return;
Image image = theItem.getImage();
if (eventLocation.x >= curFolder.getClientArea().x + theItem.getBounds().x + image.getBounds().x
&& eventLocation.x <= curFolder.getClientArea().x + theItem.getBounds().x + image.getBounds().x + image.getBounds().width
&& eventLocation.y >= theItem.getBounds().y + image.getBounds().y
&& eventLocation.y <= theItem.getBounds().y + image.getBounds().y + image.getBounds().height)
{
System.out.println("show tooltip");
}
});
shell.pack();
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}
}
Я протестировал его на Windows 7, и, кажется, он работает нормально.