2011-03-22 28 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