Как определить правильное положение изображения внутри 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...

tabItems

Тогда я хочу создать 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 изменено, чтобы увидеть его границу: delete.png

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, и, кажется, он работает нормально.

Другие вопросы по тегам