【问题标题】:Drop support from other applications to Java application放弃从其他应用程序到 Java 应用程序的支持
【发布时间】:2013-01-02 13:25:34
【问题描述】:

我需要在我的应用程序中添加对从其他应用程序(文件管理器、Web 浏览器、MS Word 和 OO 编写器)拖放图像到 JLabel 的支持。
JVM 中有很多关于 DnD 的示例,但我找不到任何可以从本机应用程序或其他 J2SE 应用程序中拖动的内容。

如何为文件管理器、Web 浏览器、MS Word 和 OO 编写器添加对图像的拖放支持?

谢谢

【问题讨论】:

    标签: java swing drag-and-drop


    【解决方案1】:

    类似的东西:

    JComponent dropTargetComponent = ...;
    new DropTarget(dropTargetComponent , DnDConstants.ACTION_COPY,
        new DropTargetListener() {
    
            public void drop(DropTargetDropEvent dtde) {
                Transferable tr = dtde.getTransferable();
                if(tr.isDataFlavorSupported(java.awt.datatransfer.DataFlavor.imageFlavor)) {
                     Image image = (Image) tr.getTransferData(java.awt.datatransfer.DataFlavor.imageFlavor);
                     // Do something with image
                }
             }
    
             ...
       }
    

    您可能还想尝试使用返回 List<File>java.awt.datatransfer.DataFlavor.javaFileListFlavor,因为来自 FileManager 的内容通常是文件列表。

    这是一个完整的示例(从 Explorer 文件管理器和 FireFox 尝试 DnD):

    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.Image;
    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.DropTargetDragEvent;
    import java.awt.dnd.DropTargetDropEvent;
    import java.awt.dnd.DropTargetEvent;
    import java.awt.dnd.DropTargetListener;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.IOException;
    import java.io.Reader;
    import java.net.URI;
    import java.util.Iterator;
    import java.util.List;
    
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.SwingUtilities;
    
    public class TestNativeDnD {
        protected void initUI() {
            final JFrame frame = new JFrame(TestNativeDnD.class.getSimpleName());
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JLabel dropTargetComponent = new JLabel("Drop something here") {
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(600, 600);
                }
            };
            dropTargetComponent.setHorizontalAlignment(JLabel.CENTER);
            final JLabel testLabel = new JLabel();
            new DropTarget(dropTargetComponent, DnDConstants.ACTION_COPY, new DropTargetListener() {
    
                @Override
                public void drop(DropTargetDropEvent dtde) {
                    try {
                        Transferable tr = dtde.getTransferable();
                        dtde.acceptDrop(DnDConstants.ACTION_COPY);
                        if (tr.isDataFlavorSupported(java.awt.datatransfer.DataFlavor.imageFlavor)) {
                            Image image = (Image) tr.getTransferData(java.awt.datatransfer.DataFlavor.imageFlavor);
                            showImageIcon(new ImageIcon(image));
                        } else if (tr.isDataFlavorSupported(java.awt.datatransfer.DataFlavor.javaFileListFlavor)) {
                            List<File> fileList = (List<File>) tr.getTransferData(java.awt.datatransfer.DataFlavor.javaFileListFlavor);
                            Iterator<File> iterator = fileList.iterator();
                            if (iterator.hasNext()) {
                                File file = iterator.next();
                                showImageIcon(new ImageIcon(file.getAbsolutePath()));
                            }
                        } else {
                            DataFlavor[] flavors = tr.getTransferDataFlavors();
                            boolean handled = false;
                            for (int i = 0; i < flavors.length; i++) {
                                if (flavors[i].isRepresentationClassReader()) {
                                    Reader reader = flavors[i].getReaderForText(tr);
                                    BufferedReader br = new BufferedReader(reader);
                                    java.lang.String line = null;
                                    while ((line = br.readLine()) != null) {
                                        try {
                                            // kde seems to append a 0 char to the end of the reader
                                            if ("0".equals(line)) {
                                                continue;
                                            }
                                            File file = new File(new URI(line));
                                            showImageIcon(new ImageIcon(file.getAbsolutePath()));
                                        } catch (Exception e) {
                                            e.printStackTrace();
                                        }
                                    }
                                }
                            }
                        }
                    } catch (UnsupportedFlavorException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
    
                public void showImageIcon(ImageIcon icon) {
                    testLabel.setIcon(icon);
                    frame.pack();
                }
    
                @Override
                public void dragEnter(DropTargetDragEvent dtde) {
                    // TODO Auto-generated method stub
    
                }
    
                @Override
                public void dragOver(DropTargetDragEvent dtde) {
                    // TODO Auto-generated method stub
    
                }
    
                @Override
                public void dropActionChanged(DropTargetDragEvent dtde) {
                    // TODO Auto-generated method stub
    
                }
    
                @Override
                public void dragExit(DropTargetEvent dte) {
                    // TODO Auto-generated method stub
    
                }
    
            });
            frame.add(dropTargetComponent);
            frame.add(testLabel, BorderLayout.EAST);
            frame.setSize(600, 600);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new TestNativeDnD().initUI();
                }
            });
        }
    
    }
    

    【讨论】:

    • 不幸的是,没有一个 Firefox 和 OO Writer 不提供 DataFlavor.imageFlavorDataFlavor.stringFlavorDataFlavor.javaFileListFlavor !文件管理器也只提供DataFlavor.stringFlavor!有什么想法吗?
    • @4r1y4n 我刚刚在 Win7 Java 6/7 上尝试了 FileManager(资源管理器)和浏览器(Firefox),它就像一个魅力。请在我的答案末尾找到一个完整的示例
    猜你喜欢
    • 2018-04-22
    • 2019-01-15
    • 2020-11-02
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    相关资源
    最近更新 更多