我正在尝试使用
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。