Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.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 Eclipse插件开发-在多个插件中的组件之间拖放_Java_Eclipse_Eclipse Plugin - Fatal编程技术网

Java Eclipse插件开发-在多个插件中的组件之间拖放

Java Eclipse插件开发-在多个插件中的组件之间拖放,java,eclipse,eclipse-plugin,Java,Eclipse,Eclipse Plugin,我开发了两个插件,plugin1和plugin2。在plugin1中有一个视图称为pluginOneView,在plugin2中有另一个视图称为plugintwoiview。因此,我的要求是plugintwoiview上几乎没有可拖动的组件,我应该能够将其拖动到pluginOneView。目前,我正在开发拖放功能,我的代码是(在pluginView2中)用于DragSource: DragSource ds = new DragSource(btn, DND.DROP_MOVE); //btn

我开发了两个插件,
plugin1
plugin2
。在
plugin1
中有一个视图称为
pluginOneView
,在
plugin2
中有另一个视图称为
plugintwoiview
。因此,我的要求是
plugintwoiview
上几乎没有可拖动的组件,我应该能够将其拖动到
pluginOneView
。目前,我正在开发拖放功能,我的代码是(在
pluginView2
中)用于
DragSource

DragSource ds = new DragSource(btn, DND.DROP_MOVE); //btn is a draggable component
    ds.setTransfer(new Transfer[] { TextTransfer.getInstance() });

    ds.addDragListener(new DragSourceAdapter() {
             // There are dragStart and other methods here
        }
}
但我的问题在于
DropTarget
方法:

DropTarget target = new DropTarget(component, dtl);
这里在
组件的位置
我需要将目标添加为
pluginOneView
(在另一个视图中)。我的问题是如何在工作区中获取该视图的组件对象,以便将其作为一个片段传递给
DropTarget
方法

我试着去

PlatformUI.getWorkbench().getViewRegistry().find("targetId");

但是它返回我的
IViewDescriptor
类型,其中作为我需要的
组件
类型。有人能帮我吗?因为我是Eclipse插件开发新手。

我想你误解了如何使用DropTarget。您不需要知道要拖动到的插件。您还使用了TextTransfer,但我假设您希望拖动Java对象而不是字符串。因此,我制作了一个小示例,演示如何在多个视图(可能在不同的插件中)之间拖动对象。在我的示例中,类型为ISomeClass的对象被传输。为了传输它,ISomeClass必须是可序列化的。我提供了自己的TransferType,即处理传输的SomeClassTransfer类。请注意,这两个视图插件都需要访问ISomeClass和SomeClassTransfer定义。实现这一点最简单的方法是制作第三个插件来保存这些类。两个视图插件都可以引用第三个插件

SomeClassTransfer:

public class SomeClassTransfer extends ByteArrayTransfer {
    private final static String[] typeNames;
    private final static int[] typeIds;
    private final static SomeClassTransfer instance;

    static {
        String typeName = "SomeClassTransfer";
        int id = registerType(typeName);
        typeNames = new String[] { typeName };
        typeIds = new int[] { id };
        instance = new SomeClassTransfer();
    }

    public static SomeClassTransfer getInstance() {
        return instance;
    }

    private SomeClassTransfer() {
    }

    @Override
    protected int[] getTypeIds() {
        return typeIds;
    }

    @Override
    protected String[] getTypeNames() {
        return typeNames;
    }

    @Override
    protected void javaToNative(Object object, TransferData transferData) {
        if (object instanceof ISomeClass) {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutput out = null;
            try {
                out = new ObjectOutputStream(bos);
                out.writeObject(object);
                byte[] objectBytes = bos.toByteArray();
                object = objectBytes;
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    out.close();
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        super.javaToNative(object, transferData);
    }

    @Override
    protected ISomeClass nativeToJava(TransferData transferData) {
        ISomeClass someClass = null;

        byte[] objectBytes = (byte[]) super.nativeToJava(transferData);
        ByteArrayInputStream bis = new ByteArrayInputStream(objectBytes);
        ObjectInput in = null;
        try {
            in = new ObjectInputStream(bis);
            Object o = in.readObject();
            if (o instanceof ISomeClass) {
                someClass = (ISomeClass) o;
            }
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                bis.close();
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return someClass;
    }
}
    int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;
    Transfer[] types = new Transfer[] { SomeClassTransfer.getInstance() };
    DragSource source = new DragSource(tableViewer.getControl(), operations);
    source.setTransfer(types);

    source.addDragListener(new DragSourceListener() {
        @Override
        public void dragStart(DragSourceEvent event) {
            if (tableViewer.getSelection().isEmpty()) {
                // do not start drag
                event.doit = false;
            }
        }

        @Override
        public void dragSetData(DragSourceEvent event) {
            if (SomeClassTransfer.getInstance().isSupportedType(
                    event.dataType)) {
                event.data = ((IStructuredSelection) tableViewer
                        .getSelection()).getFirstElement();
            }
        }

        @Override
        public void dragFinished(DragSourceEvent event) {
            // A Move operation has been performed so remove the data
            // from the source
            if (event.detail == DND.DROP_MOVE) {
                tableViewer.remove(((IStructuredSelection) tableViewer
                        .getSelection()).getFirstElement());
            }
        }
    });
    int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;
    Transfer[] types = new Transfer[] { SomeClassTransfer.getInstance() };
    DropTarget target = new DropTarget(tableViewer.getControl(), operations);
    target.setTransfer(types);

    target.addDropListener(new DropTargetListener() {
        @Override
        public void dragEnter(DropTargetEvent event) {
        }

        @Override
        public void dragOver(DropTargetEvent event) {
        }

        @Override
        public void dragLeave(DropTargetEvent event) {
        }

        @Override
        public void dragOperationChanged(DropTargetEvent event) {
        }

        @Override
        public void dropAccept(DropTargetEvent event) {
        }

        @Override
        public void drop(DropTargetEvent event) {
            if (event.data == null) {
                // no data to copy, indicate failure in event.detail
                event.detail = DND.DROP_NONE;
                return;
            }
            // data copied to viewer
            tableViewer.add((ISomeClass) event.data);
        }
    });
源代码视图:

public class SomeClassTransfer extends ByteArrayTransfer {
    private final static String[] typeNames;
    private final static int[] typeIds;
    private final static SomeClassTransfer instance;

    static {
        String typeName = "SomeClassTransfer";
        int id = registerType(typeName);
        typeNames = new String[] { typeName };
        typeIds = new int[] { id };
        instance = new SomeClassTransfer();
    }

    public static SomeClassTransfer getInstance() {
        return instance;
    }

    private SomeClassTransfer() {
    }

    @Override
    protected int[] getTypeIds() {
        return typeIds;
    }

    @Override
    protected String[] getTypeNames() {
        return typeNames;
    }

    @Override
    protected void javaToNative(Object object, TransferData transferData) {
        if (object instanceof ISomeClass) {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutput out = null;
            try {
                out = new ObjectOutputStream(bos);
                out.writeObject(object);
                byte[] objectBytes = bos.toByteArray();
                object = objectBytes;
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    out.close();
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        super.javaToNative(object, transferData);
    }

    @Override
    protected ISomeClass nativeToJava(TransferData transferData) {
        ISomeClass someClass = null;

        byte[] objectBytes = (byte[]) super.nativeToJava(transferData);
        ByteArrayInputStream bis = new ByteArrayInputStream(objectBytes);
        ObjectInput in = null;
        try {
            in = new ObjectInputStream(bis);
            Object o = in.readObject();
            if (o instanceof ISomeClass) {
                someClass = (ISomeClass) o;
            }
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                bis.close();
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return someClass;
    }
}
    int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;
    Transfer[] types = new Transfer[] { SomeClassTransfer.getInstance() };
    DragSource source = new DragSource(tableViewer.getControl(), operations);
    source.setTransfer(types);

    source.addDragListener(new DragSourceListener() {
        @Override
        public void dragStart(DragSourceEvent event) {
            if (tableViewer.getSelection().isEmpty()) {
                // do not start drag
                event.doit = false;
            }
        }

        @Override
        public void dragSetData(DragSourceEvent event) {
            if (SomeClassTransfer.getInstance().isSupportedType(
                    event.dataType)) {
                event.data = ((IStructuredSelection) tableViewer
                        .getSelection()).getFirstElement();
            }
        }

        @Override
        public void dragFinished(DragSourceEvent event) {
            // A Move operation has been performed so remove the data
            // from the source
            if (event.detail == DND.DROP_MOVE) {
                tableViewer.remove(((IStructuredSelection) tableViewer
                        .getSelection()).getFirstElement());
            }
        }
    });
    int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;
    Transfer[] types = new Transfer[] { SomeClassTransfer.getInstance() };
    DropTarget target = new DropTarget(tableViewer.getControl(), operations);
    target.setTransfer(types);

    target.addDropListener(new DropTargetListener() {
        @Override
        public void dragEnter(DropTargetEvent event) {
        }

        @Override
        public void dragOver(DropTargetEvent event) {
        }

        @Override
        public void dragLeave(DropTargetEvent event) {
        }

        @Override
        public void dragOperationChanged(DropTargetEvent event) {
        }

        @Override
        public void dropAccept(DropTargetEvent event) {
        }

        @Override
        public void drop(DropTargetEvent event) {
            if (event.data == null) {
                // no data to copy, indicate failure in event.detail
                event.detail = DND.DROP_NONE;
                return;
            }
            // data copied to viewer
            tableViewer.add((ISomeClass) event.data);
        }
    });
目的地视图:

public class SomeClassTransfer extends ByteArrayTransfer {
    private final static String[] typeNames;
    private final static int[] typeIds;
    private final static SomeClassTransfer instance;

    static {
        String typeName = "SomeClassTransfer";
        int id = registerType(typeName);
        typeNames = new String[] { typeName };
        typeIds = new int[] { id };
        instance = new SomeClassTransfer();
    }

    public static SomeClassTransfer getInstance() {
        return instance;
    }

    private SomeClassTransfer() {
    }

    @Override
    protected int[] getTypeIds() {
        return typeIds;
    }

    @Override
    protected String[] getTypeNames() {
        return typeNames;
    }

    @Override
    protected void javaToNative(Object object, TransferData transferData) {
        if (object instanceof ISomeClass) {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutput out = null;
            try {
                out = new ObjectOutputStream(bos);
                out.writeObject(object);
                byte[] objectBytes = bos.toByteArray();
                object = objectBytes;
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    out.close();
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        super.javaToNative(object, transferData);
    }

    @Override
    protected ISomeClass nativeToJava(TransferData transferData) {
        ISomeClass someClass = null;

        byte[] objectBytes = (byte[]) super.nativeToJava(transferData);
        ByteArrayInputStream bis = new ByteArrayInputStream(objectBytes);
        ObjectInput in = null;
        try {
            in = new ObjectInputStream(bis);
            Object o = in.readObject();
            if (o instanceof ISomeClass) {
                someClass = (ISomeClass) o;
            }
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                bis.close();
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return someClass;
    }
}
    int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;
    Transfer[] types = new Transfer[] { SomeClassTransfer.getInstance() };
    DragSource source = new DragSource(tableViewer.getControl(), operations);
    source.setTransfer(types);

    source.addDragListener(new DragSourceListener() {
        @Override
        public void dragStart(DragSourceEvent event) {
            if (tableViewer.getSelection().isEmpty()) {
                // do not start drag
                event.doit = false;
            }
        }

        @Override
        public void dragSetData(DragSourceEvent event) {
            if (SomeClassTransfer.getInstance().isSupportedType(
                    event.dataType)) {
                event.data = ((IStructuredSelection) tableViewer
                        .getSelection()).getFirstElement();
            }
        }

        @Override
        public void dragFinished(DragSourceEvent event) {
            // A Move operation has been performed so remove the data
            // from the source
            if (event.detail == DND.DROP_MOVE) {
                tableViewer.remove(((IStructuredSelection) tableViewer
                        .getSelection()).getFirstElement());
            }
        }
    });
    int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;
    Transfer[] types = new Transfer[] { SomeClassTransfer.getInstance() };
    DropTarget target = new DropTarget(tableViewer.getControl(), operations);
    target.setTransfer(types);

    target.addDropListener(new DropTargetListener() {
        @Override
        public void dragEnter(DropTargetEvent event) {
        }

        @Override
        public void dragOver(DropTargetEvent event) {
        }

        @Override
        public void dragLeave(DropTargetEvent event) {
        }

        @Override
        public void dragOperationChanged(DropTargetEvent event) {
        }

        @Override
        public void dropAccept(DropTargetEvent event) {
        }

        @Override
        public void drop(DropTargetEvent event) {
            if (event.data == null) {
                // no data to copy, indicate failure in event.detail
                event.detail = DND.DROP_NONE;
                return;
            }
            // data copied to viewer
            tableViewer.add((ISomeClass) event.data);
        }
    });

这段代码使您能够在两个完全独立的视图之间拖动数据。

我想您误解了如何使用DropTarget。您不需要知道要拖动到的插件。您还使用了TextTransfer,但我假设您希望拖动Java对象而不是字符串。因此,我制作了一个小示例,演示如何在多个视图(可能在不同的插件中)之间拖动对象。在我的示例中,类型为ISomeClass的对象被传输。为了传输它,ISomeClass必须是可序列化的。我提供了自己的TransferType,即处理传输的SomeClassTransfer类。请注意,这两个视图插件都需要访问ISomeClass和SomeClassTransfer定义。实现这一点最简单的方法是制作第三个插件来保存这些类。两个视图插件都可以引用第三个插件

SomeClassTransfer:

public class SomeClassTransfer extends ByteArrayTransfer {
    private final static String[] typeNames;
    private final static int[] typeIds;
    private final static SomeClassTransfer instance;

    static {
        String typeName = "SomeClassTransfer";
        int id = registerType(typeName);
        typeNames = new String[] { typeName };
        typeIds = new int[] { id };
        instance = new SomeClassTransfer();
    }

    public static SomeClassTransfer getInstance() {
        return instance;
    }

    private SomeClassTransfer() {
    }

    @Override
    protected int[] getTypeIds() {
        return typeIds;
    }

    @Override
    protected String[] getTypeNames() {
        return typeNames;
    }

    @Override
    protected void javaToNative(Object object, TransferData transferData) {
        if (object instanceof ISomeClass) {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutput out = null;
            try {
                out = new ObjectOutputStream(bos);
                out.writeObject(object);
                byte[] objectBytes = bos.toByteArray();
                object = objectBytes;
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    out.close();
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        super.javaToNative(object, transferData);
    }

    @Override
    protected ISomeClass nativeToJava(TransferData transferData) {
        ISomeClass someClass = null;

        byte[] objectBytes = (byte[]) super.nativeToJava(transferData);
        ByteArrayInputStream bis = new ByteArrayInputStream(objectBytes);
        ObjectInput in = null;
        try {
            in = new ObjectInputStream(bis);
            Object o = in.readObject();
            if (o instanceof ISomeClass) {
                someClass = (ISomeClass) o;
            }
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                bis.close();
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return someClass;
    }
}
    int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;
    Transfer[] types = new Transfer[] { SomeClassTransfer.getInstance() };
    DragSource source = new DragSource(tableViewer.getControl(), operations);
    source.setTransfer(types);

    source.addDragListener(new DragSourceListener() {
        @Override
        public void dragStart(DragSourceEvent event) {
            if (tableViewer.getSelection().isEmpty()) {
                // do not start drag
                event.doit = false;
            }
        }

        @Override
        public void dragSetData(DragSourceEvent event) {
            if (SomeClassTransfer.getInstance().isSupportedType(
                    event.dataType)) {
                event.data = ((IStructuredSelection) tableViewer
                        .getSelection()).getFirstElement();
            }
        }

        @Override
        public void dragFinished(DragSourceEvent event) {
            // A Move operation has been performed so remove the data
            // from the source
            if (event.detail == DND.DROP_MOVE) {
                tableViewer.remove(((IStructuredSelection) tableViewer
                        .getSelection()).getFirstElement());
            }
        }
    });
    int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;
    Transfer[] types = new Transfer[] { SomeClassTransfer.getInstance() };
    DropTarget target = new DropTarget(tableViewer.getControl(), operations);
    target.setTransfer(types);

    target.addDropListener(new DropTargetListener() {
        @Override
        public void dragEnter(DropTargetEvent event) {
        }

        @Override
        public void dragOver(DropTargetEvent event) {
        }

        @Override
        public void dragLeave(DropTargetEvent event) {
        }

        @Override
        public void dragOperationChanged(DropTargetEvent event) {
        }

        @Override
        public void dropAccept(DropTargetEvent event) {
        }

        @Override
        public void drop(DropTargetEvent event) {
            if (event.data == null) {
                // no data to copy, indicate failure in event.detail
                event.detail = DND.DROP_NONE;
                return;
            }
            // data copied to viewer
            tableViewer.add((ISomeClass) event.data);
        }
    });
源代码视图:

public class SomeClassTransfer extends ByteArrayTransfer {
    private final static String[] typeNames;
    private final static int[] typeIds;
    private final static SomeClassTransfer instance;

    static {
        String typeName = "SomeClassTransfer";
        int id = registerType(typeName);
        typeNames = new String[] { typeName };
        typeIds = new int[] { id };
        instance = new SomeClassTransfer();
    }

    public static SomeClassTransfer getInstance() {
        return instance;
    }

    private SomeClassTransfer() {
    }

    @Override
    protected int[] getTypeIds() {
        return typeIds;
    }

    @Override
    protected String[] getTypeNames() {
        return typeNames;
    }

    @Override
    protected void javaToNative(Object object, TransferData transferData) {
        if (object instanceof ISomeClass) {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutput out = null;
            try {
                out = new ObjectOutputStream(bos);
                out.writeObject(object);
                byte[] objectBytes = bos.toByteArray();
                object = objectBytes;
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    out.close();
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        super.javaToNative(object, transferData);
    }

    @Override
    protected ISomeClass nativeToJava(TransferData transferData) {
        ISomeClass someClass = null;

        byte[] objectBytes = (byte[]) super.nativeToJava(transferData);
        ByteArrayInputStream bis = new ByteArrayInputStream(objectBytes);
        ObjectInput in = null;
        try {
            in = new ObjectInputStream(bis);
            Object o = in.readObject();
            if (o instanceof ISomeClass) {
                someClass = (ISomeClass) o;
            }
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                bis.close();
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return someClass;
    }
}
    int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;
    Transfer[] types = new Transfer[] { SomeClassTransfer.getInstance() };
    DragSource source = new DragSource(tableViewer.getControl(), operations);
    source.setTransfer(types);

    source.addDragListener(new DragSourceListener() {
        @Override
        public void dragStart(DragSourceEvent event) {
            if (tableViewer.getSelection().isEmpty()) {
                // do not start drag
                event.doit = false;
            }
        }

        @Override
        public void dragSetData(DragSourceEvent event) {
            if (SomeClassTransfer.getInstance().isSupportedType(
                    event.dataType)) {
                event.data = ((IStructuredSelection) tableViewer
                        .getSelection()).getFirstElement();
            }
        }

        @Override
        public void dragFinished(DragSourceEvent event) {
            // A Move operation has been performed so remove the data
            // from the source
            if (event.detail == DND.DROP_MOVE) {
                tableViewer.remove(((IStructuredSelection) tableViewer
                        .getSelection()).getFirstElement());
            }
        }
    });
    int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;
    Transfer[] types = new Transfer[] { SomeClassTransfer.getInstance() };
    DropTarget target = new DropTarget(tableViewer.getControl(), operations);
    target.setTransfer(types);

    target.addDropListener(new DropTargetListener() {
        @Override
        public void dragEnter(DropTargetEvent event) {
        }

        @Override
        public void dragOver(DropTargetEvent event) {
        }

        @Override
        public void dragLeave(DropTargetEvent event) {
        }

        @Override
        public void dragOperationChanged(DropTargetEvent event) {
        }

        @Override
        public void dropAccept(DropTargetEvent event) {
        }

        @Override
        public void drop(DropTargetEvent event) {
            if (event.data == null) {
                // no data to copy, indicate failure in event.detail
                event.detail = DND.DROP_NONE;
                return;
            }
            // data copied to viewer
            tableViewer.add((ISomeClass) event.data);
        }
    });
目的地视图:

public class SomeClassTransfer extends ByteArrayTransfer {
    private final static String[] typeNames;
    private final static int[] typeIds;
    private final static SomeClassTransfer instance;

    static {
        String typeName = "SomeClassTransfer";
        int id = registerType(typeName);
        typeNames = new String[] { typeName };
        typeIds = new int[] { id };
        instance = new SomeClassTransfer();
    }

    public static SomeClassTransfer getInstance() {
        return instance;
    }

    private SomeClassTransfer() {
    }

    @Override
    protected int[] getTypeIds() {
        return typeIds;
    }

    @Override
    protected String[] getTypeNames() {
        return typeNames;
    }

    @Override
    protected void javaToNative(Object object, TransferData transferData) {
        if (object instanceof ISomeClass) {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutput out = null;
            try {
                out = new ObjectOutputStream(bos);
                out.writeObject(object);
                byte[] objectBytes = bos.toByteArray();
                object = objectBytes;
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    out.close();
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        super.javaToNative(object, transferData);
    }

    @Override
    protected ISomeClass nativeToJava(TransferData transferData) {
        ISomeClass someClass = null;

        byte[] objectBytes = (byte[]) super.nativeToJava(transferData);
        ByteArrayInputStream bis = new ByteArrayInputStream(objectBytes);
        ObjectInput in = null;
        try {
            in = new ObjectInputStream(bis);
            Object o = in.readObject();
            if (o instanceof ISomeClass) {
                someClass = (ISomeClass) o;
            }
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                bis.close();
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return someClass;
    }
}
    int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;
    Transfer[] types = new Transfer[] { SomeClassTransfer.getInstance() };
    DragSource source = new DragSource(tableViewer.getControl(), operations);
    source.setTransfer(types);

    source.addDragListener(new DragSourceListener() {
        @Override
        public void dragStart(DragSourceEvent event) {
            if (tableViewer.getSelection().isEmpty()) {
                // do not start drag
                event.doit = false;
            }
        }

        @Override
        public void dragSetData(DragSourceEvent event) {
            if (SomeClassTransfer.getInstance().isSupportedType(
                    event.dataType)) {
                event.data = ((IStructuredSelection) tableViewer
                        .getSelection()).getFirstElement();
            }
        }

        @Override
        public void dragFinished(DragSourceEvent event) {
            // A Move operation has been performed so remove the data
            // from the source
            if (event.detail == DND.DROP_MOVE) {
                tableViewer.remove(((IStructuredSelection) tableViewer
                        .getSelection()).getFirstElement());
            }
        }
    });
    int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;
    Transfer[] types = new Transfer[] { SomeClassTransfer.getInstance() };
    DropTarget target = new DropTarget(tableViewer.getControl(), operations);
    target.setTransfer(types);

    target.addDropListener(new DropTargetListener() {
        @Override
        public void dragEnter(DropTargetEvent event) {
        }

        @Override
        public void dragOver(DropTargetEvent event) {
        }

        @Override
        public void dragLeave(DropTargetEvent event) {
        }

        @Override
        public void dragOperationChanged(DropTargetEvent event) {
        }

        @Override
        public void dropAccept(DropTargetEvent event) {
        }

        @Override
        public void drop(DropTargetEvent event) {
            if (event.data == null) {
                // no data to copy, indicate failure in event.detail
                event.detail = DND.DROP_NONE;
                return;
            }
            // data copied to viewer
            tableViewer.add((ISomeClass) event.data);
        }
    });
此代码使您能够在两个完全独立的视图之间拖动数据