JFace Drag& Drop项目突出显示

时间:2013-09-24 10:12:08

标签: java drag-and-drop swt jface

我在理解用户拖动项目时如何突出显示TreeViewer的项目时遇到问题。

这是发生的事情:我开始拖动Treeviewer中的底部项目,然后它旁边的项目突出显示。问题是,我无法从DragOver事件中获取突出显示的项目。但是,如果我从该位置删除该项目,Drop方法中的事件将具有“项目”字段,其中包含突出显示的项目。当突出显示时,树的选择不会改变

我想做什么:我想根据突出显示的项目更改指针的图像。问题是我不知道如何理解哪一个突出显示。另一个问题是,在Drop方法中,突出显示的项目将是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);
}

1 个答案:

答案 0 :(得分:0)

直接从TreeItem获取DropTargetEvent.item


如果您将JFace TreeViewer与相关内容和标签提供商一起使用,那么您可以使用ViewerDropAdapter来处理该项目。