2013-09-24 2 views
0

У меня возникли проблемы с пониманием того, как элемент TreeViewer подсвечен, когда пользователь перетаскивает элемент.
Элементы перетаскивания JFace выделить

Вот что происходит: я начинаю перетаскивать нижний элемент в пределах Treeviewer, а элементы рядом с ним выделяют соответственно. Проблема в том, что я не могу получить выделенный объект из события DragOver. Но если я удалю элемент из этой позиции, событие в методе Drop будет иметь поле «item», в котором будет выделен выделенный элемент. Выбор дерева не изменяется при возникновении выделения

Что я хочу сделать: Я хочу изменить изображение указателя в соответствии с выделенным элементом. Проблема в том, что я не знаю, как понять, какой из них выделен. Еще одна ошибка для меня заключается в том, что в методе Drop выделенный объект станет целью падения (в этом случае поле secont Field сверху). Я не хочу использовать SWT.FULL_SELECTION

Вот изображение:

example

Источник сниппеты (то, что я хочу, это функциональность DragOver в тех случаях, когда я непосредственно не парит поверх элемента)

final DropTarget valuesTarget = new DropTarget(tree, DND.DROP_MOVE); 
valuesTarget.addDropListener(new DropTargetAdapter() 

@Override 
public void dragOver(DropTargetEvent event) 
{ 
    if (transfer.isSupportedType(event.currentDataType)) 
    { 
     final DropTarget target = (DropTarget)event.widget; 
     final Tree tree = (Tree)target.getControl(); 

     final Point relativeDropPoint = getRelativeDropPoint(event); 
     final TreeItem targetItem = tree.getItem(relativeDropPoint); 

     if (targetItem != null) 
     { 
      event.feedback = 
       DND.FEEDBACK_SELECT | DND.FEEDBACK_SCROLL; 
      if (event.item.getData() instanceof NotAcceptableClass) 
      { 
       event.detail = DND.DROP_NONE; 
      } 
     } 

    } 
} 

private Point getRelativeDropPoint(DropTargetEvent event) 
{ 
    final Tree tree = (Tree)((DropTarget)event.widget).getControl(); 
    final Point tableLocation = tree.toDisplay(0, 0); 
    return new Point(event.x - tableLocation.x, event.y 
       - tableLocation.y); 
} 
+0

Пожалуйста, разместите код, в идеале, [SSCCE] (http://www.sscce.org). – Baz

ответ

0

Возьмите TreeItem непосредственно с DropTargetEvent.item.


Если вы будете использовать JFace TreeViewer с соответствующим содержимым и маркировать поставщиков, то вы могли бы использовать ViewerDropAdapter, который будет заботиться о решении пункта.

+0

Привет, Мартти, спасибо за ответ. Боюсь, это не помогло. Метод getTargetItem (который я предполагаю, что вы предназначались для меня) возвращает объект прямо под курсором и поэтому возвращает null, когда я не нависаю над элементами. – bistrform

+0

@ user2245164 Очевидно, вы не можете использовать 'ViewerDropAdapter', если сами создаете свои древесные элементы и не устанавливаете на них данные. Вы должны иметь возможность получить перетаскиваемый элемент непосредственно из события, хотя - это то, что «ViewerDropAdapter» делает внутри. –

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