小弟最近用SWT做gui,其中需要将左边目录中的图标拖入右边的面板中
我使用了DND中的imagetransfer类来做,由于没见过这个相关的资料(eclipse3.4才支持imagetransfer类),
就将一个texttransfer类的实例进行了改造右边是使用canvas属性面板,用drawimage实现drop
dragsource代码如下:
drag3 = new Label(shell, SWT.BORDER);
drag3.setText("about");
Image image = new Image(display,"c:/00.gif");
drag3.setImage(image);
///drag3.setImage(display.getSystemImage(SWT.ICON_INFORMATION));
drag3.setLayoutData(new GridData());
DragSource dragSource3 = new DragSource(drag3, DND.DROP_COPY );
Transfer[] transfers3 = new Transfer[]{ ImageTransfer.getInstance() };
dragSource3.setTransfer(transfers3);
dragSource3.addDragListener(new DragSourceListener()
{
public void dragStart(DragSourceEvent event)
{
if (drag3.getImage() == null)
{
event.doit = false;
}
} public void dragSetData(DragSourceEvent event)
{
if (ImageTransfer.getInstance().isSupportedType(event.dataType))
{
event.data = drag3.getImage();
}
} public void dragFinished(DragSourceEvent event)
{
}
});
dropsource端代码如下:
canvas = new Canvas(shell, SWT.BORDER);
GridData gd = new GridData(GridData.FILL_BOTH);
gd.horizontalSpan = 3;
canvas.setLayoutData(gd);
DropTarget dropTarget = new DropTarget(canvas, DND.DROP_COPY | DND.DROP_DEFAULT);
Transfer[] types = new Transfer[]{ ImageTransfer.getInstance() };
dropTarget.setTransfer(types);
dropTarget.addDropListener(new DropTargetListener()
{
public void dragEnter(DropTargetEvent event)
{
if (event.detail == DND.DROP_DEFAULT)
{
if ((event.operations & DND.DROP_COPY) != 0)
{
event.detail = DND.DROP_COPY;
} else
{
event.detail = DND.DROP_NONE;
}
}
} public void dragLeave(DropTargetEvent event)
{
} public void dragOperationChanged(DropTargetEvent event)
{
} public void dragOver(DropTargetEvent event)
{
}
            public void dropAccept(DropTargetEvent event)
{

}

public void drop(DropTargetEvent event)
{
if (ImageTransfer.getInstance().isSupportedType(event.currentDataType))
{
Image d = (Image)event.data;//(Image)ImageTransfer.getInstance().nativeToJava(event.currentDataType);

GC gc = new GC(canvas);
int x = event.x - shell.getBounds().x - canvas.getBounds().x;
int y = event.y - shell.getBounds().y - canvas.getBounds().y;
gc.drawImage(d, 50, 50);
gc.dispose();
}
}虽然在eclipse上未出现语法错误,但运行时将图像释放到canvas时程序跳出,console错误信息如下
Exception in thread "main" org.eclipse.swt.SWTException: Data does not have correct format for type
at org.eclipse.swt.dnd.DND.error(DND.java:277)
at org.eclipse.swt.dnd.DND.error(DND.java:228)
at org.eclipse.swt.dnd.ImageTransfer.javaToNative(ImageTransfer.java:63)
at org.eclipse.swt.dnd.DragSource.GetData(DragSource.java:469)
at org.eclipse.swt.dnd.DragSource.access$7(DragSource.java:435)
at org.eclipse.swt.dnd.DragSource$4.method3(DragSource.java:258)
at org.eclipse.swt.internal.ole.win32.COMObject.callback3(COMObject.java:92)
at org.eclipse.swt.internal.ole.win32.COM.VtblCall(Native Method)
at org.eclipse.swt.internal.ole.win32.IDataObject.GetData(IDataObject.java:25)
at org.eclipse.swt.dnd.Transfer.getData(Transfer.java:44)
at org.eclipse.swt.dnd.ImageTransfer.nativeToJava(ImageTransfer.java:146)
at org.eclipse.swt.dnd.DropTarget.Drop(DropTarget.java:442)
at org.eclipse.swt.dnd.DropTarget$3.method6(DropTarget.java:257)
at org.eclipse.swt.internal.ole.win32.COMObject.callback6(COMObject.java:119)
at org.eclipse.swt.internal.ole.win32.COM.DoDragDrop(Native Method)
at org.eclipse.swt.dnd.DragSource.drag(DragSource.java:362)
at org.eclipse.swt.dnd.DragSource.access$0(DragSource.java:288)
at org.eclipse.swt.dnd.DragSource$1.handleEvent(DragSource.java:171)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1003)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3823)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3422)
at SPSS_DEMO.DragAndDropTool.<init>(DragAndDropTool.java:60)
at SPSS_DEMO.DragAndDropTool.main(DragAndDropTool.java:206)求教有这个经验的大侠们~~~~应该如何修改程序~~~~万分感谢!!!!

解决方案 »

  1.   

    ImageTransfer传输的是ImageData不是Image,把下面两个方法改一下
    public void dragSetData(DragSourceEvent event) {
    if (ImageTransfer.getInstance().isSupportedType(event.dataType)) {
    event.data = label1.getImage().getImageData();
    }
    }
    public void drop(DropTargetEvent event) {
    if (ImageTransfer.getInstance().isSupportedType(
    event.currentDataType)) {
    Image d = new Image(null, (ImageData)event.data); GC gc = new GC(canvas);
    int x = event.x - shell.getBounds().x
    - canvas.getBounds().x;
    int y = event.y - shell.getBounds().y
    - canvas.getBounds().y;
    gc.drawImage(d, 50, 50);
    gc.dispose();
    } }
      

  2.   

    可以运行了,原来API文档里有说的,没仔细看T T
    十分感谢MT502大侠~~