拖放功能其实就像我们使用windows 的时候按住CTRL然后拖动某个图标,会复制该对象。这给用户提供了很棒的用户体验,没办法程序员总是给自己找麻烦,让用户觉得方便,其实这个功能AWT也提供了Swing话只是利用了这个,因为这和界面没什么关系。

网站建设哪家好,找创新互联建站!专注于网页设计、网站建设、微信开发、重庆小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了乌兰免费建站欢迎大家使用!
DropTarget(拖放目的地)eg(将图片拖入后显示):
- public class TestDropTarget
 - {
 - final int DESKTOP_WIDTH = 480;
 - final int DESKTOP_HEIGHT = 360;
 - final int FRAME_DISTANCE = 30;
 - JFrame jf = new JFrame("测试拖放目标——把图片文件拖入该窗口");
 - //定义一个虚拟桌面
 - private JDesktopPane desktop = new JDesktopPane();
 - //保存下一个内部窗口的座标点
 - private int nextFrameX;
 - private int nextFrameY;
 - //定义内部窗口为虚拟桌面的1/2大小
 - private int width = DESKTOP_WIDTH / 2;
 - private int height = DESKTOP_HEIGHT / 2;
 - public void init()
 - {
 - desktop.setPreferredSize(new Dimension(DESKTOP_WIDTH, DESKTOP_HEIGHT));
 - //将当前窗口创建成拖放源
 - new DropTarget(jf, DnDConstants.ACTION_COPY , new ImageDropTargetListener());
 - jf.add(desktop);
 - jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 - jf.pack();
 - jf.setVisible(true);
 - }
 - class ImageDropTargetListener extends DropTargetAdapter
 - {
 - public void drop(DropTargetDropEvent event)
 - {
 - //接受复制操作
 - event.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
 - //获取拖放的内容
 - Transferable transferable = event.getTransferable();
 - DataFlavor[] flavors = transferable.getTransferDataFlavors();
 - //遍历拖放内容里的所有数据格式
 - for (int i = 0; i < flavors.length; i++)
 - {
 - DataFlavor d = flavors[i];
 - try
 - {
 - //如果拖放内容的数据格式是文件列表
 - if (d.equals(DataFlavor.javaFileListFlavor))
 - {
 - //取出拖放操作里的文件列表
 - java.util.List fileList
 - = (java.util.List) transferable.getTransferData(d);
 - for (Object f : fileList)
 - {
 - //显示每个文件
 - showImage((File)f , event);
 - }
 - }
 - }
 - catch (Exception e)
 - {
 - e.printStackTrace();
 - }
 - //强制拖放操作结束,停止阻塞拖放源
 - event.dropComplete(true);
 - }
 - }
 - //显示每个文件的工具方法
 - private void showImage(File f , DropTargetDropEvent event)throws java.io.IOException
 - {
 - Image image = ImageIO.read(f);
 - if (image == null)
 - {
 - //强制拖放操作结束,停止阻塞拖放源
 - event.dropComplete(true);
 - JOptionPane.showInternalMessageDialog(desktop , "系统不支持这种类型的文件");
 - //方法返回,不会继续操作
 - return;
 - }
 - ImageIcon icon = new ImageIcon(image);
 - //创建内部窗口显示该图片
 - JInternalFrame iframe = new JInternalFrame(f.getName()
 - ,true , true , true , true);
 - JLabel imageLabel = new JLabel(icon);
 - iframe.add(new JScrollPane(imageLabel));
 - desktop.add(iframe);
 - //设置内部窗口的原始位置(内部窗口默认大小是0X0,放在0,0位置)
 - iframe.reshape(nextFrameX, nextFrameY, width, height);
 - //使该窗口可见,并尝试选中它
 - iframe.show();
 - //计算下一个内部窗口的位置
 - nextFrameX += FRAME_DISTANCE;
 - nextFrameY += FRAME_DISTANCE;
 - if (nextFrameX + width > desktop.getWidth()) nextFrameX = 0;
 - if (nextFrameY + height > desktop.getHeight()) nextFrameY = 0;
 - }
 - }
 - public static void main(String[] args)
 - {
 - new TestDropTarget().init();
 - }
 - }
 
DropSource(拖放源)eg(将文字拖入支持拖放的文本编辑器Editplus,Eclipse,idea等。。。记事本,UltraEdit竟然不支持)拖放源主要是要将拖放对象组成Transferable对象
- public class TestDragSource
 - {
 - JFrame jf = new JFrame("Swing的拖放支持");
 - JLabel srcLabel = new JLabel("AWT的拖放支持./n"
 - +"将该文本域的内容拖入其他程序./n");
 - public void init()
 - {
 - DragSource dragSource = DragSource.getDefaultDragSource();
 - //将srcLabel转换成拖放源,它能接受复制、移动两种操作
 - dragSource.createDefaultDragGestureRecognizer(srcLabel,
 - DnDConstants.ACTION_COPY_OR_MOVE, new DragGestureListener()
 - {
 - public void dragGestureRecognized(DragGestureEvent event)
 - {
 - //将JLabel里的文本信息包装成Transferable对象
 - String txt = srcLabel.getText();
 - Transferable transferable = new StringSelection(txt);
 - //继续拖放操作,拖放过程中使用手状光标
 - event.startDrag(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR),
 - transferable);
 - }
 - });
 - jf.add(new JScrollPane(srcLabel));
 - jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 - jf.pack();
 - jf.setVisible(true);
 - }
 - public static void main(String[] args)
 - {
 - new TestDragSource().init();
 - }
 - }
 
JDK1.4开始对Swing的拖放功能做了简化,不同组件分别提供了拖放源和拖放目标,这里就讲用的最多的文本域,他既能拖入文本,也能将文本拖出,非常方便。
但默认这个功能没有启用,要手动调用setDragEnabled方法,使其生效。eg
- public class SwingDndSupport
 - {
 - JFrame jf = new JFrame("Swing的拖放支持");
 - JTextArea srcTxt = new JTextArea(8 , 30);
 - JTextField jtf = new JTextField(34);
 - public void init()
 - {
 - srcTxt.append("AWT的拖放支持./n");
 - srcTxt.append("将该文本域的内容拖入其他程序./n");
 - //启动文本域和单行文本框的拖放支持
 - srcTxt.setDragEnabled(true);
 - jtf.setDragEnabled(true);
 - jf.add(new JScrollPane(srcTxt));
 - jf.add(jtf , BorderLayout.SOUTH);
 - jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 - jf.pack();
 - jf.setVisible(true);
 - }
 - public static void main(String[] args)
 - {
 - new SwingDndSupport().init();
 - }
 - }
 
方便吧,今天就讲到这里了。
原文链接:http://blog.csdn.net/terryzero/article/details/3779252