как перетаскивать файлы из каталога в 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); } }); } }
- Как совместить прослушиватели событий с запросом на событие?
- Рисование линии между двумя точками геометрии в JMapViewer
- установить и отключить иконки JToggleButton
- Ограничение строки JTable
- Невозможно создать прозрачный и незадекларированный JFrame в JDK7 при включении nimbus
- Несколько строк заголовка JTable
- Выделите слово в JEditorPane
- Открыть ссылку в браузере с помощью кнопки java?
- Java Swing: отображение изображений изнутри Jar
- Как добавить текст другого цвета в JTextPane
- Swing GroupLayout: изменение размеров и ограничение размеров компонентов
- drag and drop jlabel вокруг экрана
- java изменить документ в DocumentListener
Это моя идея. В этом примере я использовал «традиционный» 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; } } }