Java 7:如何在Java中实现拖放?

我正在尝试使用 Java 7 Update 21进行拖放.

我的目标操作系统是:

> Windows 7
> Ubuntu 12.04
> Mac OSX 10.6 / 10.8

要求是:

>从文件系统拖动文件并将其放到我的Java应用程序(制作一个
文件复制到临时目录) – >适用于Linux& MacOSX&视窗
拖动Thunderbird的电子邮件并将其放到我的Java应用程序(保存)
他们作为完整的* .eml文件文件系统上)

以下代码适用于我的Windows,MacOSX和Ubuntu应用程序的简单文件.另一个要求是将Thunderbird的电子邮件删除到我的Java应用程序(邮件自动转换为* .eml文件并存储到磁盘).这也适用于Windows,但是我在Ubuntu和MacOSX中得到了一个“Data Flavor not supported exception”

编辑:我在Ubuntu上尝试使用OpenJDK 7,但是即使是正常的文件丢失也不起作用.只有使用JDK版本的Oracle.

有人有一个想法如何修复/实现吗?

提前谢谢了!

这是一个简单的可执行示例:

import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDropEvent;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardcopyOption;
import java.util.List;


public class DragDropTest extends javax.swing.JFrame {


    public DragDroptest() {
        initComponents();
        initDragAndDrop();
    }

    private void initDragAndDrop() {
        this.setDropTarget(new DropTarget(){
            @Override
            public synchronized void drop(DropTargetDropEvent dtde) {
                try {
                    Transferable transfer = dtde.getTransferable();
                    if(transfer.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
                        dtde.acceptDrop(DnDConstants.ACTION_copY_OR_MOVE);
                        List objects = (List)transfer.getTransferData(DataFlavor.javaFileListFlavor);
                        for(Object object : objects) {
                            if(object instanceof File) {
                                File source = (File)object;
                                File dest = new File(System.getProperty("user.home")+File.separator+source.getName());
                                Files.copy(Paths.get(source.getAbsolutePath()),Paths.get(dest.getAbsolutePath()),StandardcopyOption.REPLACE_EXISTING);
                                System.out.println("File copied from "+source.getAbsolutePath()+" to "+dest.getAbsolutePath());
                            }
                        }
                    } else if(transfer.isDataFlavorSupported(DataFlavor.stringFlavor)) {
                        dtde.acceptDrop(DnDConstants.ACTION_copY_OR_MOVE);
                        String type = (String)transfer.getTransferData(DataFlavor.stringFlavor);
                        System.err.println("Data flavor not supported: "+type);
                    } else {
                        System.err.println("Data flavor not supported.");
                    }
                } catch(UnsupportedFlavorException ex) {
                    System.err.println(ex.getMessage());
                } catch(IOException ex) {
                    System.err.println(ex.getMessage());
                } catch(Exception ex) {
                    System.err.println(ex.getMessage());
                } finally {
                    dtde.dropComplete(true);
                }
            }
        });
    }

    @SuppressWarnings("unchecked")                      
    private void initComponents() {

        setDefaultCloSEOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Drag & Drop");
        setResizable(false);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0,200,Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0,Short.MAX_VALUE)
        );

        pack();
    }                       

    public static void main(String args[]) {
        new DragDroptest().setVisible(true);
    }

}

解决方法

实际上问题不在你的Java代码中…这是ubuntu本身的一个错误,而Ubuntu Unity不支持拖放到两个Windows(在Mozilla Thunderbird和Java App之间的应用程序中).而可以将文件文件系统拖放到窗口.

要确认这个尝试将邮件文件从Thunderbird拖动到浏览器窗口,因为Gmail附件,它将无法正常工作.

跟上这个错误评论在Ubuntu Bugs Launchpad中的Bug更新从:
https://bugs.launchpad.net/unity/+bug/995039

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...