拖放到其他应用程序和操作系统?

时间:2012-07-09 15:26:23

标签: drag-and-drop javafx-2

我在我的应用程序中使用JavaFX的Drag and Drop system,到目前为止它一直运行良好。

现在我想支持拖放到外部应用程序,例如。将文件从我的应用程序拖动到资源管理器。我将如何实现这一目标?

2 个答案:

答案 0 :(得分:4)

我通过使用:

实现了您的描述
Vector<File> files = new Vector<File>();
private ClipboardContent filesToCopyClipboard = new ClipboardContent();

...

final ObjectWithAReturnablePathField draggableObj = new ObjectWithAReturnablePathField();

...

draggableObj.setOnDragDetected(new EventHandler<MouseEvent>()
{

    @Override
    public void handle(MouseEvent me) 
    {
        Dragboard db = draggableObj.startDragAndDrop(TransferMode.ANY);
        try 
        {
           File f = new File(new URI(draggableObj.getFilePath()));
           files.add(f);
           filesToCopyClipboard.putFiles(files);
        } 
        catch (URISyntaxException e) 
        {
           e.printStackTrace();
        }
        db.setContent(filesToCopyClipboard);
        me.consume();
    }

 });
 draggableObj.setOnDragDone(new EventHandler<DragEvent>() 
 {
     @Override 
     public void handle(DragEvent me) 
     {

        me.consume();
      }
 });

这意味着:

通过在任何可以返回文件路径的可拖动对象(任何节点)的setOnDragDetected方法上使用TransferMode.ANY填充ClipboardContent并使用列表填充ClipboardContent,可以实现JavaFX 2与本机应用程序之间的文件传输。在我的例子中,我创建了一个名为Thumb的类,扩展了ImageView和(以及其他一些东西)我创建了一个名为getFilePath()的方法,该方法从用于初始化ImageView()的Image返回Path。我很抱歉这个糟糕的例子和糟糕的英语,但我现在已经没时间给出更详细的答案了。我希望它有所帮助。干杯

答案 1 :(得分:0)

以下是将ImageView图像提取到操作系统上的动作侦听器的示例源代码。资源管理器(使用jpg图像的自定义过程删除alpha通道以正确显示它):

inputImageView.setOnDragDetected(new EventHandler <MouseEvent>() {
               @Override
               public void handle(MouseEvent event) {


                   // for paste as file, e.g. in Windows Explorer
                    try {

            Clipboard clipboard Clipboard.getSystemClipboard();     
                   Dragboard db = inputImageView.startDragAndDrop(TransferMode.ANY);

                   ClipboardContent content = new ClipboardContent();

                   Image sourceImage = inputImageView.getImage();

                   ImageInfo imageInfo = (ImageInfo) inputImageView.getUserData();

                   String name = FilenameUtils.getBaseName(imageInfo.getName());
                   String ext = FilenameUtils.getExtension(imageInfo.getName());


                   ///Avoid get "prefix lenght too short" error when file name lenght <= 3
                   if (name.length() < 4){
                       name = name+Long.toHexString(Double.doubleToLongBits(Math.random()));;
                       }

                   File temp = File.createTempFile(name, "."+ext);

                   if (ext.contentEquals("jpg")|| ext.contentEquals("jpeg")){
                       BufferedImage image = SwingFXUtils.fromFXImage(sourceImage, null); // Get buffered image.
                       BufferedImage imageRGB = new BufferedImage(image.getWidth(),image.getHeight(),
BufferedImage.OPAQUE);
                       Graphics2D graphics = imageRGB.createGraphics();
                       graphics.drawImage(image, 0, 0, null);
                       ImageIO.write(imageRGB, ext, temp);
                       graphics.dispose();

                       ImageIO.write(imageRGB,
                               ext, temp);  

                   }else{

                       ImageIO.write(SwingFXUtils.fromFXImage(sourceImage, null),
                               ext, temp);  
                   }




                   content.putFiles(java.util.Collections.singletonList(temp));
                   db.setContent(content);
                   clipboard.setContent(content);
                   event.consume();

                   temp.deleteOnExit();

                    } catch (IOException ex) {
                           System.out.println(ex.getMessage());
                     }

               }
           });

在使用传递给imageView的setUserData方法的Object的帮助下,它帮助我检索数据库ID和图片名称:

  public class ImageInfo {
    private String imageInfo;
    private int inputId;

    @Override
    public String toString() {
        return imageInfo;
    }

    public ImageInfo(String imageInfo, int inputId) {
        this.imageInfo = imageInfo;
        this.inputId = inputId;
    }

    public String getName() {
        return imageInfo;
    }

    public void setName(String imageInfo) {
        this.imageInfo = imageInfo;
    }

    public int getIndex() {
        return inputId;
    }

    public void setIndex(int areaindex) {
        this.inputId = inputId;
    }
}

我希望它能在预期的时间帮助某些人: - )

此致