用javaswing实现文件拖拽上传,用另一个类接收swing界面上传文件的内容
时间: 2023-12-02 21:02:59 浏览: 263
首先,需要在Java Swing中实现文件拖拽上传,可以使用JFileChooser和Drag and Drop API来实现。下面是一个简单的例子:
```java
import javax.swing.*;
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import java.io.*;
public class FileUploadGUI extends JFrame implements DropTargetListener {
private JTextArea textArea;
private JLabel label;
public FileUploadGUI() {
super("File Upload");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 创建一个文本区域和一个标签
textArea = new JTextArea();
label = new JLabel("Drag and drop files here");
// 设置布局和添加组件
setLayout(new BorderLayout());
add(new JScrollPane(textArea), BorderLayout.CENTER);
add(label, BorderLayout.PAGE_END);
setSize(500, 500);
setVisible(true);
// 添加拖放支持
new DropTarget(this, DnDConstants.ACTION_COPY_OR_MOVE, this);
}
@Override
public void dragEnter(DropTargetDragEvent dtde) {
// 当拖拽进入时,改变标签的文本
label.setText("Drop files here");
}
@Override
public void dragExit(DropTargetEvent dte) {
// 当拖拽离开时,改变标签的文本
label.setText("Drag and drop files here");
}
@Override
public void dragOver(DropTargetDragEvent dtde) {
// do nothing
}
@Override
public void drop(DropTargetDropEvent dtde) {
try {
// 获取拖拽的数据
Transferable tr = dtde.getTransferable();
if (tr.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
// 如果拖拽的是文件,则获取文件列表
dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
java.util.List<File> files = (java.util.List<File>) tr.getTransferData(DataFlavor.javaFileListFlavor);
// 遍历文件列表,读取文件内容并在文本区域中显示
for (File file : files) {
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[1024];
int n = 0;
while ((n = fis.read(buffer)) != -1) {
textArea.append(new String(buffer, 0, n));
}
fis.close();
}
// 改变标签的文本
label.setText(files.size() + " files uploaded");
dtde.dropComplete(true);
} else {
// 不支持的数据类型
dtde.rejectDrop();
}
} catch (Exception e) {
e.printStackTrace();
dtde.rejectDrop();
}
}
@Override
public void dropActionChanged(DropTargetDragEvent dtde) {
// do nothing
}
public static void main(String[] args) {
new FileUploadGUI();
}
}
```
接下来,我们需要在另一个类中接收Swing界面上传文件的内容。假设这个类名为FileReceiver,我们可以通过以下方式实现:
```java
public class FileReceiver {
public static void receiveFileContent(String content) {
// 处理上传的文件内容
System.out.println("Received file content: " + content);
}
}
```
在上面的例子中,上传的文件内容被追加到了文本区域中,我们可以从文本区域中获取上传的内容并调用FileReceiver.receiveFileContent()方法进行处理。修改drop()方法如下:
```java
@Override
public void drop(DropTargetDropEvent dtde) {
try {
// 获取拖拽的数据
Transferable tr = dtde.getTransferable();
if (tr.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
// 如果拖拽的是文件,则获取文件列表
dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
java.util.List<File> files = (java.util.List<File>) tr.getTransferData(DataFlavor.javaFileListFlavor);
// 遍历文件列表,读取文件内容并在文本区域中显示
StringBuilder sb = new StringBuilder();
for (File file : files) {
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[1024];
int n = 0;
while ((n = fis.read(buffer)) != -1) {
sb.append(new String(buffer, 0, n));
}
fis.close();
}
// 调用FileReceiver.receiveFileContent()方法处理上传的文件内容
FileReceiver.receiveFileContent(sb.toString());
// 改变标签的文本
label.setText(files.size() + " files uploaded");
dtde.dropComplete(true);
} else {
// 不支持的数据类型
dtde.rejectDrop();
}
} catch (Exception e) {
e.printStackTrace();
dtde.rejectDrop();
}
}
```
这样,当用户拖拽文件到Swing界面中时,FileReceiver.receiveFileContent()方法就会被调用并处理上传的文件内容。
阅读全文