您的位置:首页 > 编程语言 > Java开发

java实现文件拖拽

2015-08-11 15:50 489 查看
学习使用java的文件拖拽控件DropTarget。

实现文件拖拽到指定控件并显示文件路径和内容、同时将文件写到内存中等功能。

下面是源代码:

// 这里实现了DropTargetListener接口,监听拖拽事件

public class DropTargetDemo extends JFrame implements DropTargetListener {

private static final long serialVersionUID = -8621029892661060165L;

private StringBuilder sb = new StringBuilder();

private JTextArea ta = new JTextArea();
// 显示文件内容区域

private List<ByteBuffer> buflist = new ArrayList<>();
// 在内存中保存文件

public DropTargetDemo() {

setSize(400, 300);

setLocation(500, 300);

setTitle("FileDrag");

new DropTarget(ta, DnDConstants.ACTION_COPY_OR_MOVE, this);

setLayout(new BorderLayout());

ta.setEditable(false);

add(ta, BorderLayout.CENTER);

enableInputMethods(false);

setDefaultCloseOperation(EXIT_ON_CLOSE);

setVisible(true);

}

@Override

public void drop(DropTargetDropEvent dtde) {

try {

if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
// 如果拖入的文件格式受支持

{

dtde.acceptDrop(DnDConstants.ACTION_MOVE);
// 接收拖拽来的数据

@SuppressWarnings("unchecked")

List<File> list = (List<File>) (dtde.getTransferable()

.getTransferData(DataFlavor.javaFileListFlavor));

for (File file : list) {

sb.append(file.getAbsolutePath() + "\r\n");

dtde.dropComplete(true);
// 指示拖拽操作已完成

FileInputStream fis = new FileInputStream(file.getAbsolutePath());

byte[] buf = new byte[1024];

int len = 0;

ByteBuffer bb = ByteBuffer.allocate((int) file.length());

// 向内存中写数据

while((len = fis.read(buf)) > -1){

bb.put(buf, 0, len);

}

buflist.add(bb);

fis.close();

if(file.isFile()){

file.delete();

}

// 在控件中显示文件内容,注意文件编码问题

InputStreamReader isr = new InputStreamReader(new ByteArrayInputStream(bb.array()), "gbk");

Scanner sc = new Scanner(isr);

while(sc.hasNext()){

String t = sc.nextLine();

sb.append(t);

System.out.println(t);

}

sc.close();

isr.close();

ta.setText(sb.toString());

}

} else {

dtde.rejectDrop();// 否则拒绝拖拽来的数据

}

} catch (Exception e) {

e.printStackTrace();

}

}

public static void main(String[] args) {

new DropTargetDemo();

}

@Override

public void dragEnter(DropTargetDragEvent dtde) {}

@Override

public void dragExit(DropTargetEvent dte) {}

@Override

public void dragOver(DropTargetDragEvent dtde) {}

@Override

public void dropActionChanged(DropTargetDragEvent dtde) {}

}

这里只用到了DropTagetListener接口的一个方法,其他方法均未用到,我们可以实现DropTargetAdapter接口代替DropTagetListener接口,省略不必要的方法。

下面是同样功能的另一个版本的源代码:

// 注意这里没有实现DropTargetListener接口

public class DropTargetDemo extends JFrame{

private static final long serialVersionUID = -8621029892661060165L;

private StringBuilder sb = new StringBuilder();

private JTextArea ta = new JTextArea();
// 显示文件内容区域

private List<ByteBuffer> buflist = new ArrayList<>();
// 在内存中保存文件

public DropTargetDemo() {

setSize(400, 300);

setLocation(500, 300);

setTitle("FileDrag");

// 这里的监听者是dta

new DropTarget(ta, DnDConstants.ACTION_COPY_OR_MOVE, dta);

setLayout(new BorderLayout());

ta.setEditable(false);

add(ta, BorderLayout.CENTER);

enableInputMethods(false);

setDefaultCloseOperation(EXIT_ON_CLOSE);

setVisible(true);

}

// 增加一个DropTargetAdapter 对象

private DropTargetAdapter dta = new DropTargetAdapter() {

// 里面内容没有变

@Override

public void drop(DropTargetDropEvent dtde) {

try {

if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
// 如果拖入的文件格式受支持

{

dtde.acceptDrop(DnDConstants.ACTION_MOVE);
// 接收拖拽来的数据

@SuppressWarnings("unchecked")

List<File> list = (List<File>) (dtde.getTransferable()

.getTransferData(DataFlavor.javaFileListFlavor));

for (File file : list) {

sb.append(file.getAbsolutePath() + "\r\n");

dtde.dropComplete(true);
// 指示拖拽操作已完成

FileInputStream fis = new FileInputStream(file.getAbsolutePath());

byte[] buf = new byte[1024];

int len = 0;

ByteBuffer bb = ByteBuffer.allocate((int) file.length());

// 向内存中写数据

while((len = fis.read(buf)) > -1){

bb.put(buf, 0, len);

}

buflist.add(bb);

fis.close();

if(file.isFile()){

file.delete();

}

// 在控件中显示文件内容,注意文件编码问题

InputStreamReader isr = new InputStreamReader(new ByteArrayInputStream(bb.array()), "gbk");

Scanner sc = new Scanner(isr);

while(sc.hasNext()){

String t = sc.nextLine();

sb.append(t);

System.out.println(t);

}

sc.close();

isr.close();

ta.setText(sb.toString());

}

} else {

dtde.rejectDrop();// 否则拒绝拖拽来的数据

}

} catch (Exception e) {

e.printStackTrace();

}

}

};

public static void main(String[] args) {

new DropTargetDemo();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: