【问题标题】:SWT List drag and drop: Get element at drop locationSWT列表拖放:在放置位置获取元素
【发布时间】:2014-12-22 19:31:13
【问题描述】:

您好,我有一个 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.
            }
        }
    });

【问题讨论】:

    标签: java drag-and-drop swt


    【解决方案1】:

    让这件事发挥作用。可能不是最好的解决方案,但这是我想出的。

    @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));
            }
        });
    

    基本上,我得到项目被丢弃点的 Y 坐标,并检查与该 Y 坐标重叠的项目。一旦我得到目标,我需要做的就是切换源项和目标项。希望这对尝试做类似事情的人有所帮助。

    【讨论】:

      【解决方案2】:

      对于表格或树

      如果有人有同样的问题但使用表或树:DropTargetEvent 中有一个item 属性。

      event.item (Widget)
      如果关联控件是表格或树,则此字段包含位于光标坐标处的项目。

      (来源:Eclipse Help - DropTargetEvent

      【讨论】:

        猜你喜欢
        • 2013-04-28
        • 2011-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多