Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SWT树节点的拖动类型可以是什么_Java_Swt_Eclipse Rcp - Fatal编程技术网

Java SWT树节点的拖动类型可以是什么

Java SWT树节点的拖动类型可以是什么,java,swt,eclipse-rcp,Java,Swt,Eclipse Rcp,我有一个SWT树,它有图像和其他文本以及多层次的子级。 现在,我想拖动此树节点,但无法获取此树节点的正确传输类型。 因此,一旦我拖动,我就不会得到拖动图像。 是否有任何默认传输类型可用于相同的传输 下面是我的树- 我使用了以下转移,但没有工作- Transfer[] types = new Transfer[] {FileTransfer.getInstance(),ImageTransfer.getInstance() }; 我仍然不能完全确定您要求的是什么,但此代码即使与Images一起

我有一个SWT树,它有图像和其他文本以及多层次的子级。 现在,我想拖动此树节点,但无法获取此树节点的正确传输类型。 因此,一旦我拖动,我就不会得到拖动图像。 是否有任何默认传输类型可用于相同的传输

下面是我的树-

我使用了以下转移,但没有工作-

Transfer[] types = new Transfer[] {FileTransfer.getInstance(),ImageTransfer.getInstance() };

我仍然不能完全确定您要求的是什么,但此代码即使与
Image
s一起工作

如果您的文本不能用作标识符,您可以想出其他方法:

private static Map<String, Image>   mapping = new HashMap<String, Image>();

public static void main(String[] args)
{
    Display display = new Display();
    final Shell shell = new Shell(display);
    shell.setText("StackOverflow");
    shell.setLayout(new FillLayout());

    Tree tree = new Tree(shell, SWT.NONE);

    Image[] images = new Image[] { display.getSystemImage(SWT.ICON_WARNING),
            display.getSystemImage(SWT.ICON_ERROR), display.getSystemImage(SWT.ICON_INFORMATION),
            display.getSystemImage(SWT.ICON_QUESTION) };

    for (int i = 0; i < 10; i++)
    {
        TreeItem item = new TreeItem(tree, SWT.NONE);
        item.setText("Item " + i);
        item.setImage(images[i % images.length]);
        mapping.put("Item " + i, images[i % images.length]);
    }

    initDnD(display, tree);

    shell.pack();
    shell.open();
    while (!shell.isDisposed())
    {
        if (!display.readAndDispatch())
            display.sleep();
    }
    display.dispose();
}

private static void initDnD(final Display display, final Tree tree)
{
    Transfer[] types = new Transfer[] { TextTransfer.getInstance() };
    int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;

    final DragSource source = new DragSource(tree, operations);
    source.setTransfer(types);

    final TreeItem[] dragSourceItem = new TreeItem[1];
    source.addDragListener(new DragSourceListener()
    {
        public void dragStart(DragSourceEvent event)
        {
            TreeItem[] selection = tree.getSelection();
            if (selection.length > 0 && selection[0].getItemCount() == 0)
            {
                event.doit = true;
                dragSourceItem[0] = selection[0];
            }
            else
            {
                event.doit = false;
            }
        };

        public void dragSetData(DragSourceEvent event)
        {
            event.data = dragSourceItem[0].getText();
        }

        public void dragFinished(DragSourceEvent event)
        {
            if (event.detail == DND.DROP_MOVE)
                dragSourceItem[0].dispose();
            dragSourceItem[0] = null;
        }
    });

    DropTarget target = new DropTarget(tree, operations);
    target.setTransfer(types);
    target.addDropListener(new DropTargetAdapter()
    {
        public void dragOver(DropTargetEvent event)
        {
            event.feedback = DND.FEEDBACK_SCROLL;
            if (event.item != null)
            {
                TreeItem item = (TreeItem) event.item;
                Point pt = display.map(null, tree, event.x, event.y);
                Rectangle bounds = item.getBounds();
                if (pt.y < bounds.y + bounds.height / 3)
                {
                    event.feedback |= DND.FEEDBACK_INSERT_BEFORE;
                }
                else if (pt.y > bounds.y + 2 * bounds.height / 3)
                {
                    event.feedback |= DND.FEEDBACK_INSERT_AFTER;
                }
            }
        }

        public void drop(DropTargetEvent event)
        {
            if (event.data == null)
            {
                event.detail = DND.DROP_NONE;
                return;
            }
            String text = (String) event.data;
            if (event.item != null)
            {
                TreeItem item = (TreeItem) event.item;
                Point pt = display.map(null, tree, event.x, event.y);
                Rectangle bounds = item.getBounds();

                TreeItem[] items = tree.getItems();
                int index = 0;
                for (int i = 0; i < items.length; i++)
                {
                    if (items[i] == item)
                    {
                        index = i;
                        break;
                    }
                }

                if (pt.y < bounds.y + bounds.height / 3)
                {
                    TreeItem newItem = new TreeItem(tree, SWT.NONE, index);
                    newItem.setText(text);
                    newItem.setImage(mapping.get(text));
                }
                else if (pt.y > bounds.y + 2 * bounds.height / 3)
                {
                    TreeItem newItem = new TreeItem(tree, SWT.NONE, index + 1);
                    newItem.setText(text);
                    newItem.setImage(mapping.get(text));
                }
                else
                {
                    TreeItem newItem = new TreeItem(item, SWT.NONE);
                    newItem.setText(text);
                    newItem.setImage(mapping.get(text));
                }
            }
        }
    });
}
private静态映射=newhashmap();
公共静态void main(字符串[]args)
{
显示=新显示();
最终外壳=新外壳(显示);
shell.setText(“StackOverflow”);
setLayout(新的FillLayout());
Tree Tree=新树(shell,SWT.NONE);
Image[]images=新图像[]{display.getSystemImage(SWT.ICON_警告),
display.getSystemImage(SWT.ICON\u错误),display.getSystemImage(SWT.ICON\u信息),
display.getSystemImage(SWT.ICON\u QUESTION)};
对于(int i=0;i<10;i++)
{
TreeItem=新的TreeItem(树,SWT.NONE);
项目.setText(“项目”+i);
item.setImage(图像[i%images.length]);
mapping.put(“项”+i,图像[i%images.length]);
}
initDnD(显示,树);
shell.pack();
shell.open();
而(!shell.isDisposed())
{
如果(!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
私有静态void initDnD(最终显示,最终树)
{
传输[]类型=新传输[]{TextTransfer.getInstance()};
int operations=DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;
最终DragSource源=新的DragSource(树,操作);
source.setTransfer(类型);
最终树项[]dragSourceItem=新树项[1];
source.addDragListener(新的DragSourceListener()
{
公共作废dragStart(DragSourceEvent事件)
{
TreeItem[]selection=tree.getSelection();
如果(selection.length>0&&selection[0].getItemCount()==0)
{
event.doit=true;
dragSourceItem[0]=选择[0];
}
其他的
{
event.doit=false;
}
};
公共作废dragSetData(DragSourceEvent事件)
{
event.data=dragSourceItem[0].getText();
}
公共无效dragFinished(DragSourceEvent事件)
{
如果(event.detail==DND.DROP\u MOVE)
dragSourceItem[0]。dispose();
dragSourceItem[0]=null;
}
});
DropTarget目标=新的DropTarget(树,操作);
target.setTransfer(类型);
addDropListener(新的DropTargetAdapter()
{
公共无效dragOver(DropTargetEvent事件)
{
event.feedback=DND.feedback\u滚动;
如果(event.item!=null)
{
TreeItem item=(TreeItem)event.item;
点pt=display.map(null,tree,event.x,event.y);
矩形边界=item.getBounds();
if(pt.ybounds.y+2*bounds.height/3)
{
event.feedback |=DND.feedback _插入_之后;
}
}
}
公共作废删除(DropTargetEvent事件)
{
如果(event.data==null)
{
event.detail=DND.DROP\u无;
返回;
}
字符串文本=(字符串)event.data;
如果(event.item!=null)
{
TreeItem item=(TreeItem)event.item;
点pt=display.map(null,tree,event.x,event.y);
矩形边界=item.getBounds();
TreeItem[]items=tree.getItems();
int指数=0;
对于(int i=0;ibounds.y+2*bounds.height/3)
{
TreeItem newItem=新的TreeItem(树,SWT.NONE,索引+1);
newItem.setText(文本);
setImage(mapping.get(text));
}
其他的
{
TreeItem newItem=新的TreeItem(项目,SWT.NONE);
newItem.setText(文本);
setImage(mapping.get(text));
}
}
}
});
}

你看了吗?是的,它使用textTransfer,但对我来说,它不仅仅是文本,所以我想要一个能接受任何东西的东西来起草。这是我关心的问题。实际上,我想接受任何要拖动的内容,而不考虑文本或任何类型的对象在我的RCP应用程序上的可用性。因此,如何做到这一点……理想情况下,我相信继承、转让和做一些事情可能会奏效,而这正是我正在努力的方向。