用javaswing实现文件拖拽上传,用另一个类接收swing界面上传文件的内容
时间: 2023-06-27 10:02:39 浏览: 102
首先,需要在Java Swing中添加一个JPanel组件来允许用户拖放文件。可以使用JFileChooser来选择文件并获取文件路径。然后,将文件路径传递给另一个类以进行处理。
以下是一个简单的示例:
```java
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
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.File;
import java.io.IOException;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingConstants;
import javax.swing.TransferHandler;
import javax.swing.border.Border;
import javax.swing.border.TitledBorder;
public class FileUploadDemo extends JFrame {
private static final long serialVersionUID = 1L;
private JTextArea textArea;
private JButton uploadButton;
private FileUploadListener fileUploadListener;
public FileUploadDemo() {
super("File Upload Demo");
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS));
// Add drop panel
JPanel dropPanel = new JPanel();
dropPanel.setBackground(Color.WHITE);
dropPanel.setPreferredSize(new Dimension(500, 100));
Border border = BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.GRAY),
"Drag and Drop Files Here", TitledBorder.CENTER, TitledBorder.TOP);
dropPanel.setBorder(border);
dropPanel.setTransferHandler(new FileDropHandler());
dropPanel.setDropTarget(new PanelDropTarget());
mainPanel.add(dropPanel);
// Add text area
textArea = new JTextArea();
textArea.setEditable(false);
JScrollPane scrollPane = new JScrollPane(textArea);
scrollPane.setPreferredSize(new Dimension(500, 200));
mainPanel.add(scrollPane);
// Add upload button
JPanel buttonPanel = new JPanel(new FlowLayout());
uploadButton = new JButton("Upload");
uploadButton.setEnabled(false);
uploadButton.addActionListener(e -> {
if (fileUploadListener != null) {
fileUploadListener.onFileUploaded(textArea.getText());
}
});
buttonPanel.add(uploadButton);
mainPanel.add(buttonPanel);
add(mainPanel, BorderLayout.CENTER);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setLocationRelativeTo(null);
}
public void setFileUploadListener(FileUploadListener listener) {
this.fileUploadListener = listener;
}
private class PanelDropTarget implements DropTargetListener {
@Override
public void dragEnter(DropTargetDragEvent dtde) {
// Check if the data flavor is supported
if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
dtde.acceptDrag(DnDConstants.ACTION_COPY);
} else {
dtde.rejectDrag();
}
}
@Override
public void dragOver(DropTargetDragEvent dtde) {
// Do nothing
}
@Override
public void dropActionChanged(DropTargetDragEvent dtde) {
// Do nothing
}
@Override
public void dragExit(DropTargetEvent dte) {
// Do nothing
}
@Override
public void drop(DropTargetDropEvent dtde) {
// Get the transferable and check if it contains files
Transferable transferable = dtde.getTransferable();
if (transferable.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
dtde.acceptDrop(DnDConstants.ACTION_COPY);
try {
// Get the list of files and add them to the text area
List<File> files = (List<File>) transferable.getTransferData(DataFlavor.javaFileListFlavor);
for (File file : files) {
textArea.append(file.getAbsolutePath() + "\n");
}
uploadButton.setEnabled(true);
} catch (UnsupportedFlavorException | IOException e) {
e.printStackTrace();
}
} else {
dtde.rejectDrop();
}
}
}
private class FileDropHandler extends TransferHandler {
private static final long serialVersionUID = 1L;
@Override
public boolean canImport(TransferSupport support) {
return support.isDataFlavorSupported(DataFlavor.javaFileListFlavor);
}
@Override
public boolean importData(TransferSupport support) {
if (support.isDrop()) {
DropTargetDropEvent dtde = (DropTargetDropEvent) support.getDropEvent();
return importFiles(dtde);
} else {
return false;
}
}
private boolean importFiles(DropTargetDropEvent dtde) {
// Get the transferable and check if it contains files
Transferable transferable = dtde.getTransferable();
if (transferable.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
dtde.acceptDrop(DnDConstants.ACTION_COPY);
try {
// Get the list of files and add them to the text area
List<File> files = (List<File>) transferable.getTransferData(DataFlavor.javaFileListFlavor);
for (File file : files) {
textArea.append(file.getAbsolutePath() + "\n");
}
uploadButton.setEnabled(true);
} catch (UnsupportedFlavorException | IOException e) {
e.printStackTrace();
}
return true;
} else {
dtde.rejectDrop();
return false;
}
}
}
public interface FileUploadListener {
void onFileUploaded(String filePaths);
}
public static void main(String[] args) {
FileUploadDemo demo = new FileUploadDemo();
demo.setFileUploadListener(filePaths -> System.out.println("Uploaded files: " + filePaths));
demo.setVisible(true);
}
}
```
在这个示例中,我们使用一个JPanel作为拖放区域,并将其设置为接受文件的拖放操作。我们还添加了一个JTextArea来显示上传的文件路径,并添加了一个JButton来触发上传文件的操作。
在主方法中,我们通过设置FileUploadListener来处理上传的文件。在实际应用中,可以将上传的文件路径传递给另一个类来进行处理。