Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>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.</p> <p><img src="https://i.stack.imgur.com/iYImR.png" alt="enter image description here"><img src="https://i.stack.imgur.com/JOs41.png" alt="enter image description here"></p> <p>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</p> <pre><code>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 &amp;&amp; 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 &amp;&amp; transferData.size() &gt; 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(); } } } } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload