本题的功能是监听鼠标的拖曳操作。窗口中有一个列表框,列表框中列出了当前目录的所有文件,鼠标选中一个或多个文件后拖曳出窗口,此操作的功能是将拖曳的文件复制一份在拖曳的目的目录下。
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
public class java3
public static void main(String[]args)
JFrame frame=new DragSourceFrame();
frame.setDefauhCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.show();
class DragSourceFrame extends JFrame
public DragSourceFrame()
setTitle("java3");
setSize(WIDTH,HEIGHT);
Container contentPane=getContentPane();
File f=new File(".").getabsoluteFile();
File[]files=f.listFiles();
model=new DefauhListModel();
for(int i=0;i<files.length();i++)
try
model.addElement(files[i].getCanonicalFile());
catch(IOException exception)
JOptionPane.showMessageDialog(this,exception);
fileList=new JList(model);
contentPane.add(new JScrollPane(fileList),
BorderLayout.CENTER);
contentPane.add(new JLabel("从列表中拖曳出文件"),
BorderLayout.NORTH);
DragSource dragSource=DragSource.getDefaultDragSource();
dragSource.createDefaultDragGestureRecognizer(ileList,
DnDConstants.ACTION_COPY_OR_MOVE,new
DragGestureListener()
public void dragGestureRecognized(
DragGestureEvent event)
draggedValues=fileList.getSelectedValues();
Transferable transferable
=new FileListTransferable(draggedValues);
event,startDrag(null,transferable,
new FileListDragSourceListener());
);
private class FileListDragSourceListener implements DragSourceAdapter
public void dragDropEnd(DragSourceDropEvent event)
if(event.getDropSuccess())
int action=event.getDropAction();
if(action==DnDConstants.ACTION_MOVE)
for(int i=0;i<draggedValues.length i++)
model.removeElement(draggedValues[i]);
private JList fileList;
private DefaultListModel model;
private Object[]draggedValues;
private static final int WIDTH=300;
private static final int HEIGHT=200;
class FileListTransferable implements Transferable
public FileListTransferable(Object[]files)
fileList=new ArrayList(Arrays.asList(files));
public DataFlavor[]getTransferDataFlavors()
return flavors;
public boolean isDataFlavorSupported(DataFlavor flavor)
return Arrays.asList(flavors).contains(flavor);
public Object getTransferData(DataFlavor flavor)
throws UnsupportedFlavorException
if(flavor.equals(DataFlavor.javaFileListFlavor))
return fileList;
else if(flavor.equals(DataFlavor.stringFlavor))
return fileList.toString();
else
throw new UnsupportedFlavorException(flavor);
private static DataFlavor[]flavors=
DataFlavor.javaFileListFlavor,
DataFlavor.stringFlavor
;
private java.util.List fileList;
参考答案:第1处:File f=new File(".").getAbsoluteFile()
第2处:int i=0;i<files.length;i++
第3处:private class FileListDragSourceListener extends DragSourceAdapter
解析: 第1处是通过绝对路径创建一个File对象f;第2处是files中是f文件所在目录下的所有文件名列表,此处就是遍历这些文件名;第3处是定义了一个FileListDragsourceListener类继承用于接收拖动源事件的抽象适配器类DragSourceAdapter。