Java SWT列表拖放:在拖放位置获取元素

Java SWT列表拖放:在拖放位置获取元素,java,drag-and-drop,swt,Java,Drag And Drop,Swt,嗨,我有一个SWT列表,我希望能够通过拖放更改列表中项目的顺序。 我有一个部分实现的代码。我不确定如何获取发生拖放的元素,即获取释放拖动项的项(以便我可以将其与拖动项交换)。 以下是我目前掌握的代码: listComposite = new Composite(parent, SWT.NONE); documentList = new List(listComposite, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); Transf

嗨,我有一个SWT列表,我希望能够通过拖放更改列表中项目的顺序。 我有一个部分实现的代码。我不确定如何获取发生拖放的元素,即获取释放拖动项的项(以便我可以将其与拖动项交换)。 以下是我目前掌握的代码:

    listComposite = new Composite(parent, SWT.NONE);
    documentList = new List(listComposite, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
    Transfer[] types = new Transfer[] { TextTransfer.getInstance() };
    DragSource source = new DragSource(documentList, DND.DROP_MOVE | DND.DROP_COPY);
    source.setTransfer(types);

    source.addDragListener(new DragSourceAdapter()
    {
        @Override
        public void dragSetData(DragSourceEvent event)
        {
            // Get the selected items in the drag source
            DragSource ds = (DragSource) event.widget;
            List list = (List) ds.getControl();
            String[] selection = list.getSelection();
            event.data = selection[0];
        }
    });
    DropTarget target = new DropTarget(documentList, DND.DROP_MOVE | DND.DROP_COPY
            | DND.DROP_DEFAULT);
    target.setTransfer(types);
    target.addDropListener(new DropTargetAdapter()
    {
        @Override
        public void dragEnter(DropTargetEvent event)
        {
            if (event.detail == DND.DROP_DEFAULT)
            {
                event.detail = (event.operations & DND.DROP_COPY) != 0 ? DND.DROP_COPY
                        : DND.DROP_NONE;
            }

            // Allow dropping text only
            for (int i = 0, n = event.dataTypes.length; i < n; i++)
            {
                if (TextTransfer.getInstance().isSupportedType(event.dataTypes[i]))
                {
                    event.currentDataType = event.dataTypes[i];
                }
            }
        }

        @Override
        public void dragOver(DropTargetEvent event)
        {
            event.feedback = DND.FEEDBACK_SELECT | DND.FEEDBACK_SCROLL;
        }

        @Override
        public void drop(DropTargetEvent event)
        {
            if (TextTransfer.getInstance().isSupportedType(event.currentDataType))
            {
                  //HELP: How to get the element were the drop occurs and swap it with the draged element.
            }
        }
    });
listComposite=新组合(父项,SWT.NONE);
documentList=新列表(listComposite,SWT.BORDER | SWT.H|u SCROLL | SWT.V|u SCROLL);
传输[]类型=新传输[]{TextTransfer.getInstance()};
DragSource source=新的DragSource(文档列表,DND.DROP\u MOVE | DND.DROP\u COPY);
source.setTransfer(类型);
source.addDragListener(新的DragSourceAdapter()
{
@凌驾
公共作废dragSetData(DragSourceEvent事件)
{
//获取拖动源中的选定项
DragSource ds=(DragSource)event.widget;
List=(List)ds.getControl();
String[]selection=list.getSelection();
event.data=选择[0];
}
});
DropTarget target=新的DropTarget(文档列表,DND.DROP\u MOVE | DND.DROP\u COPY
|DND.删除(默认设置);
target.setTransfer(类型);
addDropListener(新的DropTargetAdapter()
{
@凌驾
公共无效dragEnter(DropTargetEvent事件)
{
if(event.detail==DND.DROP\u默认值)
{
event.detail=(event.operations和DND.DROP\u COPY)!=0?DND.DROP\u COPY
:DND.DROP\u无;
}
//仅允许删除文本
for(int i=0,n=event.dataTypes.length;i
让这件事起作用了。可能不是最好的解决方案,但这就是我想到的

@Override
        public void drop(DropTargetEvent event)
        {
            String sourceItemIndex = (String) event.data;
            String targetItemIndex = null;
            if (TextTransfer.getInstance().isSupportedType(event.currentDataType))
            {
                int dropYCordinate = event.y
                        - documentList.toDisplay(documentList.getLocation()).y;
                int itemTop = 0;
                // Search for the item index where the drop took place
                for (int i = 0; i < documentList.getItemCount(); i++)
                {

                    if (dropYCordinate >= itemTop
                            && dropYCordinate <= itemTop + documentList.getItemHeight())
                    {
                        targetItemIndex = documentList.getTopIndex() + i + "";
                    }
                    itemTop += documentList.getItemHeight();
                }
            }
            swapListItems(Integer.parseInt(sourceItemIndex), Integer.parseInt(targetItemIndex));
        }
    });
@覆盖
公共作废删除(DropTargetEvent事件)
{
字符串sourceItemIndex=(字符串)event.data;
字符串targetItemIndex=null;
if(TextTransfer.getInstance().IsupportedType(event.currentDataType))
{
int dropYCordinate=event.y
-toDisplay(documentList.getLocation()).y;
int itemTop=0;
//搜索发生删除的项目索引
对于(int i=0;i=itemTop

&&DropyCoordination让这件事起作用了。可能不是最好的解决方案,但这就是我想到的

@Override
        public void drop(DropTargetEvent event)
        {
            String sourceItemIndex = (String) event.data;
            String targetItemIndex = null;
            if (TextTransfer.getInstance().isSupportedType(event.currentDataType))
            {
                int dropYCordinate = event.y
                        - documentList.toDisplay(documentList.getLocation()).y;
                int itemTop = 0;
                // Search for the item index where the drop took place
                for (int i = 0; i < documentList.getItemCount(); i++)
                {

                    if (dropYCordinate >= itemTop
                            && dropYCordinate <= itemTop + documentList.getItemHeight())
                    {
                        targetItemIndex = documentList.getTopIndex() + i + "";
                    }
                    itemTop += documentList.getItemHeight();
                }
            }
            swapListItems(Integer.parseInt(sourceItemIndex), Integer.parseInt(targetItemIndex));
        }
    });
@覆盖
公共作废删除(DropTargetEvent事件)
{
字符串sourceItemIndex=(字符串)event.data;
字符串targetItemIndex=null;
if(TextTransfer.getInstance().IsupportedType(event.currentDataType))
{
int dropYCordinate=event.y
-toDisplay(documentList.getLocation()).y;
int itemTop=0;
//搜索发生删除的项目索引
对于(int i=0;i=itemTop

&&DropyCoordination让这件事起作用了。可能不是最好的解决方案,但这就是我想到的

@Override
        public void drop(DropTargetEvent event)
        {
            String sourceItemIndex = (String) event.data;
            String targetItemIndex = null;
            if (TextTransfer.getInstance().isSupportedType(event.currentDataType))
            {
                int dropYCordinate = event.y
                        - documentList.toDisplay(documentList.getLocation()).y;
                int itemTop = 0;
                // Search for the item index where the drop took place
                for (int i = 0; i < documentList.getItemCount(); i++)
                {

                    if (dropYCordinate >= itemTop
                            && dropYCordinate <= itemTop + documentList.getItemHeight())
                    {
                        targetItemIndex = documentList.getTopIndex() + i + "";
                    }
                    itemTop += documentList.getItemHeight();
                }
            }
            swapListItems(Integer.parseInt(sourceItemIndex), Integer.parseInt(targetItemIndex));
        }
    });
@覆盖
公共作废删除(DropTargetEvent事件)
{
字符串sourceItemIndex=(字符串)event.data;
字符串targetItemIndex=null;
if(TextTransfer.getInstance().IsupportedType(event.currentDataType))
{
int dropYCordinate=event.y
-toDisplay(documentList.getLocation()).y;
int itemTop=0;
//搜索发生删除的项目索引
对于(int i=0;i=itemTop

&&DropyCoordination让这件事起作用了。可能不是最好的解决方案,但这就是我想到的

@Override
        public void drop(DropTargetEvent event)
        {
            String sourceItemIndex = (String) event.data;
            String targetItemIndex = null;
            if (TextTransfer.getInstance().isSupportedType(event.currentDataType))
            {
                int dropYCordinate = event.y
                        - documentList.toDisplay(documentList.getLocation()).y;
                int itemTop = 0;
                // Search for the item index where the drop took place
                for (int i = 0; i < documentList.getItemCount(); i++)
                {

                    if (dropYCordinate >= itemTop
                            && dropYCordinate <= itemTop + documentList.getItemHeight())
                    {
                        targetItemIndex = documentList.getTopIndex() + i + "";
                    }
                    itemTop += documentList.getItemHeight();
                }
            }
            swapListItems(Integer.parseInt(sourceItemIndex), Integer.parseInt(targetItemIndex));
        }
    });
@覆盖
公共作废删除(DropTargetEvent事件)
{
字符串sourceItemIndex=(字符串)event.data;
字符串targetItemIndex=null;
if(TextTransfer.getInstance().IsupportedType(event.currentDataType))
{
int dropYCordinate=event.y
-toDisplay(documentList.getLocation()).y;
int itemTop=0;
//搜索发生删除的项目索引
对于(int i=0;i=itemTop
&&表或树的DropyCoordinate
另外,如果有人有同样的问题,但使用了表或树:在
DropTargetEvent
中有一个
item
属性

event.item
Widget

如果关联控件是表或树,则此字段包含位于光标坐标处的项

(来源:)

用于表格或树 另外,如果有人有相同的专业