黑马程序员技术交流社区

标题: java 如何实现拖拽获取文件路径? [打印本页]

作者: First    时间: 2013-6-18 17:30
标题: java 如何实现拖拽获取文件路径?
本帖最后由 Super_Class 于 2013-6-18 22:07 编辑

相信大家对视频播放器的文件拖拽非常熟悉,把文件的图标拖到播放器上就能播放视频了。
那么java 要怎样才能实现这样的拖拽功能呢??

作者: changweihua    时间: 2013-6-18 21:08
  1. public class TestDropTarget
  2. {
  3.         final int DESKTOP_WIDTH = 480;
  4.         final int DESKTOP_HEIGHT = 360;
  5.         final int FRAME_DISTANCE = 30;
  6.         JFrame jf = new JFrame("测试拖放目标——把图片文件拖入该窗口");
  7.         //定义一个虚拟桌面
  8.         private JDesktopPane desktop = new JDesktopPane();
  9.         //保存下一个内部窗口的座标点
  10.         private int nextFrameX;
  11.         private int nextFrameY;
  12.         //定义内部窗口为虚拟桌面的1/2大小
  13.         private int width = DESKTOP_WIDTH / 2;
  14.         private int height = DESKTOP_HEIGHT / 2;

  15.         public void init()
  16.         {
  17.                 desktop.setPreferredSize(new Dimension(DESKTOP_WIDTH, DESKTOP_HEIGHT));
  18.                 //将当前窗口创建成拖放源
  19.                 new DropTarget(jf, DnDConstants.ACTION_COPY ,  new ImageDropTargetListener());
  20.                 jf.add(desktop);
  21.                 jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  22.                 jf.pack();
  23.                 jf.setVisible(true);
  24.         }

  25.         class ImageDropTargetListener extends DropTargetAdapter
  26.         {
  27.                 public void drop(DropTargetDropEvent event)
  28.                 {
  29.                         //接受复制操作
  30.                         event.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
  31.                         //获取拖放的内容
  32.                         Transferable transferable = event.getTransferable();
  33.                         DataFlavor[] flavors = transferable.getTransferDataFlavors();
  34.                         //遍历拖放内容里的所有数据格式
  35.                         for (int i = 0; i < flavors.length; i++)
  36.                         {  
  37.                                 DataFlavor d = flavors[i];
  38.                                 try
  39.                                 {
  40.                                         //如果拖放内容的数据格式是文件列表
  41.                                         if (d.equals(DataFlavor.javaFileListFlavor))
  42.                                         {
  43.                                                 //取出拖放操作里的文件列表
  44.                                                 java.util.List fileList
  45.                                                         = (java.util.List) transferable.getTransferData(d);
  46.                                                 for (Object f : fileList)
  47.                                                 {
  48.                                                         //显示每个文件
  49.                                                         showImage((File)f , event);
  50.                                                 }
  51.                                         }
  52.                                 }
  53.                                 catch (Exception e)
  54.                                 {  
  55.                                         e.printStackTrace();
  56.                                 }
  57.                                 //强制拖放操作结束,停止阻塞拖放源
  58.                                 event.dropComplete(true);
  59.                         }
  60.                 }
  61.                 //显示每个文件的工具方法
  62.                 private void showImage(File f , DropTargetDropEvent event)throws java.io.IOException
  63.                 {
  64.                         Image image = ImageIO.read(f);
  65.                         if (image == null)
  66.                         {
  67.                                 //强制拖放操作结束,停止阻塞拖放源
  68.                                 event.dropComplete(true);
  69.                                 JOptionPane.showInternalMessageDialog(desktop , "系统不支持这种类型的文件");
  70.                                 //方法返回,不会继续操作
  71.                                 return;
  72.                         }
  73.                         ImageIcon icon = new ImageIcon(image);
  74.                         //创建内部窗口显示该图片
  75.                         JInternalFrame iframe = new JInternalFrame(f.getName()
  76.                                 ,true , true , true , true);
  77.                         JLabel imageLabel = new JLabel(icon);
  78.                         iframe.add(new JScrollPane(imageLabel));
  79.                         desktop.add(iframe);
  80.                         //设置内部窗口的原始位置(内部窗口默认大小是0X0,放在0,0位置)
  81.                         iframe.reshape(nextFrameX, nextFrameY, width, height);
  82.                         //使该窗口可见,并尝试选中它
  83.                         iframe.show();
  84.                         //计算下一个内部窗口的位置
  85.                         nextFrameX += FRAME_DISTANCE;
  86.                         nextFrameY += FRAME_DISTANCE;
  87.                         if (nextFrameX + width > desktop.getWidth()) nextFrameX = 0;
  88.                         if (nextFrameY + height > desktop.getHeight()) nextFrameY = 0;
  89.                 }
  90.         }
  91.         public static void main(String[] args)
  92.         {
  93.                 new TestDropTarget().init();
  94.         }
  95. }
复制代码

作者: First    时间: 2013-6-18 21:57
用的是DropTargetAdapter啊,赞一个




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2