how to drag and drop files from a directory in java

前端 未结 2 1443
独厮守ぢ
独厮守ぢ 2020-11-30 01:44

I want to implement dragging and dropping of files from a directory such as someones hard drive but can\'t figure out how to do it. I\'ve read the java api but it talks of c

相关标签:
2条回答
  • 2020-11-30 01:58

    This is my take on the idea. I've used the "traditional" drag and drop API in this example. It has some extra "paint" tweaks just to show off what you might be able to do.

    enter image description hereenter image description here

    This example doesn't scan folders dropped onto it, so any folder will only register as a single file, but I'm sure you can work it out

    public class TestDragNDropFiles {
    
        public static void main(String[] args) {
            new TestDragNDropFiles();
        }
    
        public TestDragNDropFiles() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    }
    
                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new BorderLayout());
                    frame.add(new DropPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public class DropPane extends JPanel {
    
            private DropTarget dropTarget;
            private DropTargetHandler dropTargetHandler;
            private Point dragPoint;
    
            private boolean dragOver = false;
            private BufferedImage target;
    
            private JLabel message;
    
            public DropPane() {
                try {
                    target = ImageIO.read(new File("target.png"));
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
    
                setLayout(new GridBagLayout());
                message = new JLabel();
                message.setFont(message.getFont().deriveFont(Font.BOLD, 24));
                add(message);
    
            }
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(400, 400);
            }
    
            protected DropTarget getMyDropTarget() {
                if (dropTarget == null) {
                    dropTarget = new DropTarget(this, DnDConstants.ACTION_COPY_OR_MOVE, null);
                }
                return dropTarget;
            }
    
            protected DropTargetHandler getDropTargetHandler() {
                if (dropTargetHandler == null) {
                    dropTargetHandler = new DropTargetHandler();
                }
                return dropTargetHandler;
            }
    
            @Override
            public void addNotify() {
                super.addNotify();
                try {
                    getMyDropTarget().addDropTargetListener(getDropTargetHandler());
                } catch (TooManyListenersException ex) {
                    ex.printStackTrace();
                }
            }
    
            @Override
            public void removeNotify() {
                super.removeNotify();
                getMyDropTarget().removeDropTargetListener(getDropTargetHandler());
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                if (dragOver) {
                    Graphics2D g2d = (Graphics2D) g.create();
                    g2d.setColor(new Color(0, 255, 0, 64));
                    g2d.fill(new Rectangle(getWidth(), getHeight()));
                    if (dragPoint != null && target != null) {
                        int x = dragPoint.x - 12;
                        int y = dragPoint.y - 12;
                        g2d.drawImage(target, x, y, this);
                    }
                    g2d.dispose();
                }
            }
    
            protected void importFiles(final List files) {
                Runnable run = new Runnable() {
                    @Override
                    public void run() {
                        message.setText("You dropped " + files.size() + " files");
                    }
                };
                SwingUtilities.invokeLater(run);
            }
    
            protected class DropTargetHandler implements DropTargetListener {
    
                protected void processDrag(DropTargetDragEvent dtde) {
                    if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
                        dtde.acceptDrag(DnDConstants.ACTION_COPY);
                    } else {
                        dtde.rejectDrag();
                    }
                }
    
                @Override
                public void dragEnter(DropTargetDragEvent dtde) {
                    processDrag(dtde);
                    SwingUtilities.invokeLater(new DragUpdate(true, dtde.getLocation()));
                    repaint();
                }
    
                @Override
                public void dragOver(DropTargetDragEvent dtde) {
                    processDrag(dtde);
                    SwingUtilities.invokeLater(new DragUpdate(true, dtde.getLocation()));
                    repaint();
                }
    
                @Override
                public void dropActionChanged(DropTargetDragEvent dtde) {
                }
    
                @Override
                public void dragExit(DropTargetEvent dte) {
                    SwingUtilities.invokeLater(new DragUpdate(false, null));
                    repaint();
                }
    
                @Override
                public void drop(DropTargetDropEvent dtde) {
    
                    SwingUtilities.invokeLater(new DragUpdate(false, null));
    
                    Transferable transferable = dtde.getTransferable();
                    if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
                        dtde.acceptDrop(dtde.getDropAction());
                        try {
    
                            List transferData = (List) transferable.getTransferData(DataFlavor.javaFileListFlavor);
                            if (transferData != null && transferData.size() > 0) {
                                importFiles(transferData);
                                dtde.dropComplete(true);
                            }
    
                        } catch (Exception ex) {
                            ex.printStackTrace();
                        }
                    } else {
                        dtde.rejectDrop();
                    }
                }
            }
    
            public class DragUpdate implements Runnable {
    
                private boolean dragOver;
                private Point dragPoint;
    
                public DragUpdate(boolean dragOver, Point dragPoint) {
                    this.dragOver = dragOver;
                    this.dragPoint = dragPoint;
                }
    
                @Override
                public void run() {
                    DropPane.this.dragOver = dragOver;
                    DropPane.this.dragPoint = dragPoint;
                    DropPane.this.repaint();
                }
            }
    
        }
    }
    
    0 讨论(0)
  • 2020-11-30 02:10

    You need to experiment with Drag & Drop and see exactly what flavors are available when you try to drag files. If you do this in your custom TransferHandler you'll be pleasantly surprised one Flavor is the DataFlavor.javaFileListFlavor, which indicates that the item can be used simply as a List. Try it and you'll see that it works!

    Note on review of your posted code, I don't see any code for your attempt at using a TransferHandler, so it is hard to say what you could be doing wrong here.

    Edit 1
    You seem to be trying to use a MouseListener for your drag and drop, and I'm not familiar with this usage. Can you show a reference to a tutorial that tells you to do this?

    Edit 2

    import java.awt.datatransfer.DataFlavor;
    import java.awt.datatransfer.UnsupportedFlavorException;
    import java.io.File;
    import java.io.IOException;
    import java.util.List;
    
    import javax.swing.*;
    
    @SuppressWarnings("serial")
    public class FileDragDemo extends JPanel {
       private JList list = new JList();
    
       public FileDragDemo() {
          list.setDragEnabled(true);
          list.setTransferHandler(new FileListTransferHandler(list));
    
          add(new JScrollPane(list));
       }
    
       private static void createAndShowGui() {
          FileDragDemo mainPanel = new FileDragDemo();
    
          JFrame frame = new JFrame("FileDragDemo");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.getContentPane().add(mainPanel);
          frame.pack();
          frame.setLocationByPlatform(true);
          frame.setVisible(true);
       }
    
       public static void main(String[] args) {
          SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                createAndShowGui();
             }
          });
       }
    }
    
    @SuppressWarnings("serial")
    class FileListTransferHandler extends TransferHandler {
       private JList list;
    
       public FileListTransferHandler(JList list) {
          this.list = list;
       }
    
       public int getSourceActions(JComponent c) {
          return COPY_OR_MOVE;
       }
    
       public boolean canImport(TransferSupport ts) {
          return ts.isDataFlavorSupported(DataFlavor.javaFileListFlavor);
       }
    
       public boolean importData(TransferSupport ts) {
          try {
             @SuppressWarnings("rawtypes")
             List data = (List) ts.getTransferable().getTransferData(
                   DataFlavor.javaFileListFlavor);
             if (data.size() < 1) {
                return false;
             }
    
             DefaultListModel listModel = new DefaultListModel();
             for (Object item : data) {
                File file = (File) item;
                listModel.addElement(file);
             }
    
             list.setModel(listModel);
             return true;
    
          } catch (UnsupportedFlavorException e) {
             return false;
          } catch (IOException e) {
             return false;
          }
       }
    }
    
    0 讨论(0)
提交回复
热议问题