您的位置:首页 > 产品设计 > UI/UE

Java Swing GUI文件拖拽

2009-12-29 19:40 405 查看
为了方便,有时我们需要直接将本地文件或字符或图片直接拖拽到图形上,让组件自动打开拖拽的文件。基于这种思想,我写了如下代码实现这个拖拽监听的功能。

1.UI源码

package ibees.desktop;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.WindowConstants;

/**
*
* @author zhang xiaojin
* 演示Swing文件拖拽
*/
public class DropDragDemo {
public static void main(String[] args){
JFrame frame = new JFrame("文件拖拽Demo");
frame.setSize(500, 400);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

JPanel panel = new JPanel();
panel.setBorder(BorderFactory.createTitledBorder("文件拖拽演示"));

JTextArea textArea = new DropDragSupportTextArea();
JScrollPane jsp = new JScrollPane();
jsp.setViewportView(textArea);
textArea.setColumns(40);
textArea.setRows(20);

panel.add(jsp);
frame.add(panel);
frame.setVisible(true);
}
}


这段源码的效果如下:里面的两个文件名是我拖拽进去的。



2.实现监听的类

package ibees.desktop;

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.JTextArea;

/**
*
* @author Administrator
*/
public class DropDragSupportTextArea extends JTextArea implements DropTargetListener{
private DropTarget dropTarget;

public DropDragSupportTextArea() {
//注册DropTarget,并将它与组件相连,处理哪个组件的相连
//即连通组件(第一个this)和Listener(第二个this)
dropTarget = new DropTarget(this,DnDConstants.ACTION_COPY_OR_MOVE, this, true);
}

/**
* 拖入文件或字符串,这里只说明能拖拽,并未打开文件并显示到文本区域中
*/
public void dragEnter(DropTargetDragEvent dtde) {
DataFlavor[] dataFlavors = dtde.getCurrentDataFlavors();
if(dataFlavors[0].match(DataFlavor.javaFileListFlavor)){
try {
Transferable tr = dtde.getTransferable();
Object obj = tr.getTransferData(DataFlavor.javaFileListFlavor);
List<File> files = (List<File>)obj;
for(int i = 0; i < files.size(); i++){
append(files.get(i).getAbsolutePath()+"/r/n");
}
} catch (UnsupportedFlavorException ex) {

} catch (IOException ex) {

}
}
}

public void dragOver(DropTargetDragEvent dtde) {

}

public void dropActionChanged(DropTargetDragEvent dtde) {

}

public void dragExit(DropTargetEvent dte) {

}

public void drop(DropTargetDropEvent dtde) {

}

}


这个类的主要作用是将监听器和组件关联起来。

支持二个类联合就可以实现拖拽了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: