2015-04-29 4 views
3

добавить некоторые CTabItem с с Image с к CTabFolder:Как определить правильное положение изображения внутри CTabItem

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

+0

Любые отзывы о моем ответе? – Baz

+1

Я рад, что вас заинтересовало ваше решение. Извините за задержку, я был на каникулах на этой неделе. Я проверил ваш код дома, и похоже, что проблема не возникает для упрощенного примера. Но мне нужно проверить это в реальном приложении, чтобы принять окончательное решение, если проблема действительно решена. Я сделаю это в понедельник, как только приеду на работу. –

ответ

1

Дайте код ниже выстрела. Это основано на моем ответе here.

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

+1

Я скорректировал свое приложение, чтобы использовать ваш фрагмент кода, но, к сожалению, он не работает. Я извлек использованное изображение из org.eclilpse.ui и изменил его, чтобы увидеть границы. Вот скриншот, где вы видите, что всплывающая подсказка появляется там, где она не должна: http://i.imgur.com/ZT46ZHh.png –

+0

@ DannyLo Это интересно. К сожалению, я не могу понять, почему это происходит. – Baz

+0

Я только что отредактировал мой вопрос, чтобы предоставить изображение с рамкой, возможно, вы можете протестировать его в своей системе. –

Смежные вопросы