程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java Swing編程:拖放功能

Java Swing編程:拖放功能

編輯:關於JAVA

拖放功能其實就像我們使用Windows 的時候按住CTRL然後拖動某個圖標,會復制該對象。這給用戶提供了很棒的用戶體驗,沒辦法程序員總是給自己找麻煩,讓用戶覺得方便,其實這個功能AWT也提供了Swing話只是利用了這個,因為這和界面沒什麼關系。

DropTarget(拖放目的地)eg(將圖片拖入後顯示):

  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. }

DropSource(拖放源)eg(將文字拖入支持拖放的文本編輯器Editplus,Eclipse,idea等。。。記事本,UltraEdit竟然不支持)拖放源主要是要將拖放對象組成Transferable對象

  1. public class TestDragSource
  2. {
  3. JFrame jf = new JFrame("Swing的拖放支持");
  4. JLabel srcLabel = new JLabel("AWT的拖放支持./n"
  5. +"將該文本域的內容拖入其他程序./n");
  6. public void init()
  7. {
  8. DragSource dragSource = DragSource.getDefaultDragSource();
  9. //將srcLabel轉換成拖放源,它能接受復制、移動兩種操作
  10. dragSource.createDefaultDragGestureRecognizer(srcLabel,
  11. DnDConstants.ACTION_COPY_OR_MOVE, new DragGestureListener()
  12. {
  13. public void dragGestureRecognized(DragGestureEvent event)
  14. {
  15. //將JLabel裡的文本信息包裝成Transferable對象
  16. String txt = srcLabel.getText();
  17. Transferable transferable = new StringSelection(txt);
  18. //繼續拖放操作,拖放過程中使用手狀光標
  19. event.startDrag(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR),
  20. transferable);
  21. }
  22. });
  23. jf.add(new JScrollPane(srcLabel));
  24. jf.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
  25. jf.pack();
  26. jf.setVisible(true);
  27. }
  28. public static void main(String[] args)
  29. {
  30. new TestDragSource().init();
  31. }
  32. }

JDK1.4開始對Swing的拖放功能做了簡化,不同組件分別提供了拖放源和拖放目標,這裡就講用的最多的文本域,他既能拖入文本,也能將文本拖出,非常方便。

但默認這個功能沒有啟用,要手動調用setDragEnabled方法,使其生效。eg

  1. public class SwingDndSupport
  2. {
  3. JFrame jf = new JFrame("Swing的拖放支持");
  4. JTextArea srcTxt = new JTextArea(8 , 30);
  5. JTextFIEld jtf = new JTextFIEld(34);
  6. public void init()
  7. {
  8. srcTxt.append("AWT的拖放支持./n");
  9. srcTxt.append("將該文本域的內容拖入其他程序./n");
  10. //啟動文本域和單行文本框的拖放支持
  11. srcTxt.setDragEnabled(true);
  12. jtf.setDragEnabled(true);
  13. jf.add(new JScrollPane(srcTxt));
  14. jf.add(jtf , BorderLayout.SOUTH);
  15. jf.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
  16. jf.pack();
  17. jf.setVisible(true);
  18. }
  19. public static void main(String[] args)
  20. {
  21. new SwingDndSupport().init();
  22. }
  23. }

方便吧,今天就講到這裡了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved