4

我在我的应用程序中使用 JavaFX 的拖放系统,到目前为止它运行良好。

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

4

2 回答 2

5

我已经通过使用实现了您所描述的:

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,可以实现 JavaFX 2 和本机应用程序之间的文件传输。在我的例子中,我创建了一个名为 Thumb 的类来扩展 ImageView,并且(除其他外)我创建了一个名为 getFilePath() 的方法,它从用于初始化 ImageView() 的 Image 返回路径。对于糟糕的例子和糟糕的英语,我很抱歉顺便说一句,但到目前为止,我已经没有时间给出更详细的答案了。我希望它有所帮助。干杯

于 2012-07-09T20:04:52.090 回答
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 方法的对象,它可以帮助我检索数据库 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;
    }
}

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

问候

于 2014-04-11T19:54:39.660 回答