Перетащите файл на метку SWT с изображением (DND) - PullRequest
0 голосов
/ 22 марта 2011

Описание проблемы:

Пользователь должен иметь возможность перетаскивать файл изображения со своего компьютера в приложение RCP.Drop-target - это SWT-Label, которая генерируется с помощью Eclipse FormToolkit. (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;
 }
});

Вопрос: Как зарегистрировать события dragEnter на метке SWT, на которой показано изображение?

Спасибо

Ответы [ 3 ]

0 голосов
/ 30 августа 2016

Я использовал SashForm, чтобы установить фоновое изображение из локальной системы.В соответствии с вашим требованием я также выполнил text и label, но не установил.Вы можете установить его с помощью 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 голосов
/ 08 февраля 2017

Простой способ: перетаскивание файла на метку 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
0 голосов
/ 25 марта 2011

В вашем примере были некоторые проблемы, из-за которых это не компилировалось для меня.После устранения проблем я смог перетащить файлы 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);

, но это не должно иметь значения.

...