0

TreeViewerユーザーがアイテムをドラッグしているときに、 のアイテムがどのように強調表示されるかを理解するのに問題があります。

何が起こるか: 内の一番下のアイテムをドラッグし始めるTreeviewerと、それに応じてその隣のアイテムが強調表示されます。問題は、DragOverイベントから強調表示されたアイテムを取得できないことです。しかし、この位置からアイテムをドロップすると、Dropメソッドのイベントには、強調表示されたアイテムを保持する「アイテム」フィールドがあります。ハイライトが発生しても、ツリーの選択は変更されません

やりたいこと:ハイライトされた項目に合わせてポインタのイメージを変えたい。問題は、どれが強調表示されているかを理解する方法がわからないことです。私にとってもう 1 つの問題は、Drop メソッドでは、強調表示された項目がドロップのターゲットになることです (この場合、上から 2 番目のフィールド)。使いたくないSWT.FULL_SELECTION

画像は次のとおりです。

例

ソース スニペット (私が欲しいのは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);
}
4

1 に答える 1

0

からTreeItem直接取得しDropTargetEvent.itemます。


TreeViewer関連付けられたコンテンツおよびラベル プロバイダーでJFace を使用する場合ViewerDropAdapterは、アイテムの解決を処理する を使用できます。

于 2013-09-25T20:22:37.160 に答える