2011-03-22 32 views
0

问题描述:使用图像(DND)在SWT标签上放置文件

用户应该能够将图像文件从他的计算机拖到RCP应用程序。放弃目标是通过Eclipse FormToolkit生成的SWT标签。 (Eclipse Forms)

使用以下代码,用户可以将图像文件以及浏览器中的图像拖放到标签上(效果很好)。 出现该问题,当标签显示的图像:

lblImage.setImage() 

在我的例子,我设置了标签的图像,在用户放弃了文件。因此,后续拖动不再注册。 (dragEnter事件方法不再被调用)

/** create label **/ 
Label lblImage = fFormToolkit.createLabel(fForm.getBody(), ""); 
GridData gd = new GridData(); 
gd.widthHint = 200; 
gd.heightHint = 200; 
lblImage.setLayoutData(gd); 

/** drag drop support **/ 
int ops = DND.DROP_COPY | DND.DROP_LINK | DND.DROP_DEFAULT; 
final FileTransfer fTransfer = FileTransfer.getInstance(); 
final ImageTransfer iTransfer = ImageTransfer.getInstance(); 
Transfer[] transfers = new Transfer[] { fTransfer, iTransfer }; 
DropTarget target = new DropTarget(fLblArtWork, ops); 
target.setTransfer(transfers); 

target.addDropListener(new DropTargetAdapter() { 

@Override 
public void drop(DropTargetEvent event) { 
    if (event.data instanceof String[]) { 
    String[] filenames = (String[]) event.data; 
    if (filenames.length > 0){ 
     Image i = new Image(Display.getCurrent(), filepath); 
     lblImage.setImage(i); 
    } 
    } else if (event.data instanceof ImageData) { 
     Image i = new Image(Display.getCurrent(), data); 
     lblImage.setImage(i); 
    } 
} 

public void dragEnter(DropTargetEvent event) { 
    System.out.println("drag enter"); 
    event.detail = DND.DROP_COPY; 
} 
}); 

问题:如何注册一个SWT标签显示的图像dragEnter事件事件?

感谢

+0

你可以请充实你的drop()方法来展示你如何设置标签? – rancidfishbreath 2011-03-22 15:56:51

+0

我在“drop”方法中添加了“drop”方法的详细信息... 以及第一个“if”子句,我从“imageData”-drops(从浏览器或类似程序中)区分“正常”文件滴..) – xeronimus 2011-03-25 12:12:48

+0

我想SWT会在标签的“前面”绘制图像,因此标签本身不再注册鼠标拖动输入。也许我应该使用Canvas作为放置目标并显示图像... – xeronimus 2011-03-25 12:19:16

回答

0

在您的例子出现了一些问题,导致此不编译我。在我解决了问题之后,我可以将png文件拖放到组件上,并且每次连续拖放都正确地更改了图像。

下面是变化:

原始

DropTarget target = new DropTarget(fLblArtWork, ops); 

变成了:

DropTarget target = new DropTarget(lblImage, ops); 

原始

Image i = new Image(Display.getCurrent(), filepath); 

变成了:

Image i = new Image(Display.getCurrent(), filenames[0]); 

原始

Image i = new Image(Display.getCurrent(), data); 

成为

Image i = new Image(Display.getCurrent(), (ImageData) event.data); 

我也创造了我的标签方式如下:

final Label lblImage = new Label(shell, SWT.NONE); 

但这不应该有所作为。

0

我在这里用SashForm来设置本地系统的背景图片。 AS根据您的要求我也做了textlabel,但我没有设置。你可以通过设置它的labelobject.setImage(image);

final SashForm sashForm = new SashForm(composite, SWT.BORDER); 
    sashForm.setBounds(136, 10, 413, 237); 

    final Label lblHello = new Label(composite, SWT.NONE); 
    DragSource dragSource = new DragSource(lblHello, DND.DROP_NONE); 

    ImageTransfer imgTrans=ImageTransfer.getInstance(); 
    FileTransfer fileTrans=FileTransfer.getInstance(); 
    Transfer[] transfer=new Transfer[] { fileTrans,imgTrans,TextTransfer.getInstance() }; 
    DropTarget dropTarget = new DropTarget(sashForm, DND.DROP_NONE); 
    dropTarget.setTransfer(transfer); 
    dragSource.setTransfer(transfer); 

    lblHello.setBounds(27, 219, 55, 15); 
    lblHello.setText("Hello"); 


    dragSource.addDragListener(new DragSourceAdapter() { 
     @Override 
     public void dragStart(DragSourceEvent event) { 
      event.doit=true; 

     } 
    }); 


    //Drop Event 
    dropTarget.addDropListener(new DropTargetAdapter() { 
     @Override 
     public void drop(DropTargetEvent event) { 
      System.out.println(event.detail); 
      //String path = System.getProperty("C:\\Users\\Public\\Pictures\\Sample Pictures\\Desert.jpg"); 
      Image image=new Image(display, "C:\\Users\\Public\\Pictures\\Sample Pictures\\Desert.jpg"); 

      sashForm.setBackgroundImage(image); 
     } 
    }); 
0

简单的办法:在SWT标签拖放文件与图片(DND)

当用户释放鼠标移到放目标发生跌落事件

final CLabel lblNewLabel = new CLabel(parent, SWT.BORDER); 
lblNewLabel.setBounds(10, 43, 326, 241); 
lblNewLabel.setText("Drop Target"); 

// Allow data to be copied or moved to the drop target 
DropTarget dropTarget = new DropTarget(lblNewLabel, DND.DROP_MOVE| DND.DROP_COPY | DND.DROP_DEFAULT); 

// Receive data in Text or File format 
final TextTransfer textTransfer = TextTransfer.getInstance(); 
final FileTransfer fileTransfer = FileTransfer.getInstance(); 
Transfer[] types = new Transfer[] {fileTransfer, textTransfer}; 
dropTarget.setTransfer(types); 

// DropTargetEvent 
dropTarget.addDropListener(new DropTargetAdapter() { 

    @Override 
    public void drop(DropTargetEvent event) { 

     if (textTransfer.isSupportedType(event.currentDataType)) { 
      String text = (String)event.data; 
      lblNewLabel.setText(text); 
     } 
     if (fileTransfer.isSupportedType(event.currentDataType)){ 

      //clear Label Text 
      lblNewLabel.setText(""); 

      //list out selected file 
      String[] files = (String[])event.data; 
      for (int i = 0; i < files.length; i++) { 

       String[] split = files[i].split("\\."); 
       String ext = split[split.length - 1]; 

       // Set Images format "jpg" and "png" 
       if(ext.equalsIgnoreCase("jpg") || ext.equalsIgnoreCase("png")) 
       { 
        lblNewLabel.setImage(SWTResourceManager.getImage(files[i]));  
       } 
       else 
       { 
        lblNewLabel.setText(files[i]); 
       } 
      }//end for loop 
     } 
    }//End drop() 
});//End addDropListener