как перетаскивать файлы из каталога в java

Я хочу реализовать drag and drop файлов из каталога, такого как жесткий диск someones, но не могу понять, как это сделать. Я читал java api, но он говорит о выборе цвета и перетаскивании между списками, но как перетаскивать файлы из файловой системы компьютеров и заходить в мое приложение. Я пробовал писать class handhandler и событие мыши, когда начинается drag and drop, но ничего не работает. Теперь я вернусь к тому, что у меня установлен JFileChooser, поэтому drag and drop включено, но как его удалить?

Любая информация или точка в правильном направлении очень ценится.

import javax.swing.*; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import javax.swing.BorderFactory; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.SwingUtilities; import javax.swing.filechooser.FileFilter; public class FileChooserDemo extends JPanel implements ActionListener { JLabel selectedFileLabel; JList selectedFilesList; JLabel returnCodeLabel; public FileChooserDemo() { super(); createContent(); } void initFrameContent() { JPanel closePanel = new JPanel(); add(closePanel, BorderLayout.SOUTH); } private void createContent() { setLayout(new BorderLayout()); JPanel NorthPanel = new JPanel(); JMenuBar menuBar = new JMenuBar(); JMenu menu = new JMenu("File"); JMenuItem quit = new JMenuItem("Quit"); menuBar.add(menu); menu.add(quit); NorthPanel.add(menu,BorderLayout.NORTH); JPanel buttonPanel = new JPanel(new GridLayout(7,1 )); JButton openButton = new JButton("Open..."); openButton.setActionCommand("OPEN"); openButton.addActionListener(this); buttonPanel.add(openButton); JButton saveButton = new JButton("Save..."); saveButton.setActionCommand("SAVE"); saveButton.addActionListener(this); buttonPanel.add(saveButton); JButton delete = new JButton("Delete"); delete.addActionListener(this); delete.setActionCommand("DELETE"); buttonPanel.add(delete); add(buttonPanel, BorderLayout.WEST); // create a panel to display the selected file(s) and the return code JPanel displayPanel = new JPanel(new BorderLayout()); selectedFileLabel = new JLabel("-"); selectedFileLabel.setBorder(BorderFactory.createTitledBorder ("Selected File/Directory ")); displayPanel.add(selectedFileLabel, BorderLayout.NORTH); selectedFilesList = new JList(); JScrollPane sp = new JScrollPane(selectedFilesList); sp.setBorder(BorderFactory.createTitledBorder("Selected Files ")); MouseListener listener = new MouseAdapter() { public void mousePressed(MouseEvent me) { JComponent comp = (JComponent) me.getSource(); TransferHandler handler = comp.getTransferHandler(); handler.exportAsDrag(comp, me, TransferHandler.MOVE); } }; selectedFilesList.addMouseListener(listener); displayPanel.add(sp); returnCodeLabel = new JLabel(""); returnCodeLabel.setBorder(BorderFactory.createTitledBorder("Return Code")); displayPanel.add(returnCodeLabel, BorderLayout.SOUTH); add(displayPanel); } public void actionPerformed(ActionEvent e) { int option = 0; File selectedFile = null; File[] selectedFiles = new File[0]; if (e.getActionCommand().equals("CLOSE")) { System.exit(0); } else if (e.getActionCommand().equals("OPEN")) { JFileChooser chooser = new JFileChooser(); chooser.setDragEnabled(true); chooser.setMultiSelectionEnabled(true); option = chooser.showOpenDialog(this); selectedFiles = chooser.getSelectedFiles(); } else if (e.getActionCommand().equals("SAVE")) { JFileChooser chooser = new JFileChooser(); option = chooser.showSaveDialog(this); selectedFiles = chooser.getSelectedFiles(); } // display the selection and return code if (selectedFile != null) selectedFileLabel.setText(selectedFile.toString()); else selectedFileLabel.setText("null"); DefaultListModel listModel = new DefaultListModel(); for (int i =0; i < selectedFiles.length; i++) listModel.addElement(selectedFiles[i]); selectedFilesList.setModel(listModel); returnCodeLabel.setText(Integer.toString(option)); } public static void main(String[] args) { SwingUtilities.invokeLater (new Runnable() { public void run() { FileChooserDemo app = new FileChooserDemo(); app.initFrameContent(); JFrame frame = new JFrame("LoquetUP"); frame.getContentPane().add(app); frame.setDefaultCloseOperation(3); frame.setSize(600,400); frame.setResizable(false); frame.setLocationRelativeTo(null); //frame.pack(); frame.setVisible(true); } }); } } 

Это моя идея. В этом примере я использовал «традиционный» API перетаскивания. У него есть некоторые дополнительные «красные» твики, чтобы показать, что вы могли бы сделать.

введите описание изображения здесьвведите описание изображения здесь

В этом примере не сканируются папки, на которые он упал, поэтому любая папка будет регистрироваться только как один файл, но я уверен, что вы сможете ее решить

 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(); } } } } 

Вам нужно поэкспериментировать с Drag & Drop и посмотреть, какие именно варианты доступны, когда вы пытаетесь перетащить файлы. Если вы сделаете это в своем пользовательском TransferHandler, вы будете приятно удивлены, что один Flavor – это DataFlavor.javaFileListFlavor , который указывает, что элемент можно использовать просто как List . Попробуйте, и вы увидите, что он работает!

Обратите внимание на обзор вашего опубликованного кода, я не вижу никакого кода для вашей попытки использовать TransferHandler, поэтому трудно сказать, что вы можете делать неправильно здесь.

Редактировать 1
Кажется, вы пытаетесь использовать MouseListener для перетаскивания, и я не знаком с этим использованием. Можете ли вы показать ссылку на учебник, который подскажет вам сделать это?

Изменить 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; } } } 
  • Java Подождите, пока stream завершится
  • Есть ли способ принять только числовые значения в JTextField?
  • Как сделать редактор таблиц JComboBox иметь дизайн обычного JComboBox?
  • Как сделать JFrame Modal в Swing java
  • Эффективное цветовое отображение изображения на Java
  • Как изменить стиль стрелки в JComboBox
  • Как прокручивать несколько объектов одновременно?
  • Java: сохранение формата изображения JPanel
  • Мне нужно запустить JFrame из другого JFrame и запустить его как независимые приложения, помочь?
  • Java Full Screen Program (Swing) -Tab / ALT F4
  • Как установить изображение в качестве фона для фрейма в Swing GUI java?
  • Interesting Posts

    Windows 8 Pro чистая установка – все медленное; Жесткий диск постоянно на 100%

    Какова правильная декларация основных?

    Является ли std :: abs (0u) плохо сформированным?

    Скриптинг Bitlocker Расшифровка локального жесткого диска

    DDRescue. Я сделал неправильную команду, которая заставляет ее занять больше времени, чем ожидалось.

    Почему не нужно, чтобы литералы enums Java могли иметь параметры типового типа?

    Windows 8.1 застрял в «Проверка обновлений …»

    Maven за автогенерированным прокси

    Метод printf (String, Object ) в типе PrintStream не применим для аргументов (…)

    Используйте String.split () с несколькими разделителями

    Условное форматирование электронной таблицы Google на основе другой ценности ячейки

    Как реализовать сито из Eratosthenes с помощью многопоточного C #?

    String.Equals () не работает по назначению

    Переопределение частных методов в Java

    Отключить сочетание клавиш Alt + Arrow

    Давайте будем гением компьютера.