< 返回技术文档列表

Java Swing编程中的拖放功能怎么用

发布时间:2021-11-07 02:17:48⊙投诉举报

这篇文章给大家介绍Java Swing编程中的拖放功能怎么用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

拖放功能其实就像我们使用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("测试拖放目标&mdash;&mdash;把图片文件拖入该窗口");      //定义一个虚拟桌面      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();      }  }

方便吧,今天就讲到这里了。

关于Java Swing编程中的拖放功能怎么用就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。


/template/Home/Zkeys/PC/Static