TreeWrapper.java
上传用户:hltofo
上传日期:2021-08-24
资源大小:21k
文件大小:8k
源码类别:

TreeView控件

开发平台:

Java

  1. package net.antonioshome.swing.treewrapper.example;
  2. import java.awt.datatransfer.StringSelection;
  3. import java.awt.dnd.DnDConstants;
  4. import java.awt.dnd.DragGestureEvent;
  5. import java.awt.dnd.DragGestureListener;
  6. import java.awt.dnd.DragGestureRecognizer;
  7. import java.awt.dnd.DragSource;
  8. import java.awt.dnd.DragSourceDragEvent;
  9. import java.awt.dnd.DragSourceDropEvent;
  10. import java.awt.dnd.DragSourceEvent;
  11. import java.awt.dnd.DragSourceListener;
  12. import java.awt.dnd.DropTarget;
  13. import java.awt.dnd.DropTargetDragEvent;
  14. import java.awt.dnd.DropTargetDropEvent;
  15. import java.awt.dnd.DropTargetEvent;
  16. import java.awt.dnd.DropTargetListener;
  17. import javax.swing.JTree;
  18. import javax.swing.tree.DefaultTreeModel;
  19. import javax.swing.tree.MutableTreeNode;
  20. import javax.swing.tree.TreeNode;
  21. import javax.swing.tree.TreePath;
  22. public class TreeWrapper {
  23. private JTree tree;
  24. private DragSource dragSource;
  25. private DnDNode dndNode = new DnDNode();
  26. private MutableTreeNode dropNode;
  27. public TreeWrapper(JTree aTree) {
  28. tree = aTree;
  29. initHandler();
  30. }
  31. private void initHandler() {
  32. dragSource = new DragSource();
  33. DragGestureRecognizer draGestureRecognizer = dragSource
  34. .createDefaultDragGestureRecognizer(tree,
  35. DnDConstants.ACTION_COPY_OR_MOVE,
  36. new TreeDragGestureListener());
  37. DropTarget dropTarget = new DropTarget(tree,
  38. DnDConstants.ACTION_COPY_OR_MOVE, new TreeDropTargetListener());
  39. }
  40. class TreeDragGestureListener implements DragGestureListener {
  41. public void dragGestureRecognized(DragGestureEvent dge) {
  42. if (!tree.isEnabled())
  43. return;
  44. TreePath draggedPath = tree.getClosestPathForLocation(dge
  45. .getDragOrigin().x, dge.getDragOrigin().y);
  46. if (draggedPath == null)
  47. return;
  48. TreeNode node = (TreeNode) draggedPath.getLastPathComponent();
  49. if (node instanceof MutableTreeNode && (node.getParent() != null)
  50. && (node.getParent() instanceof MutableTreeNode))
  51. ;
  52. else
  53. return;
  54. TransferableTreeNode transferableNode = new TransferableTreeNode(
  55. tree, (MutableTreeNode) node, tree.isExpanded(draggedPath));
  56. dndNode.setDraggedNode(node);
  57. dragSource.startDrag(dge, null, transferableNode,
  58. new TreeDragSourceListener());
  59. }
  60. }
  61. class TreeDragSourceListener implements DragSourceListener {
  62. public void dragDropEnd(DragSourceDropEvent arg0) {
  63. resetDragAndDrop();
  64. }
  65. public void dragEnter(DragSourceDragEvent arg0) {
  66. }
  67. public void dragExit(DragSourceEvent arg0) {
  68. }
  69. public void dragOver(DragSourceDragEvent arg0) {
  70. }
  71. public void dropActionChanged(DragSourceDragEvent arg0) {
  72. }
  73. }
  74. class TreeDropTargetListener implements DropTargetListener {
  75. private TreeNode lastDragOverNode;
  76. public void dragOver(DropTargetDragEvent dtde) {
  77. System.out.println("DragOver----------------");
  78. if (!tree.isEnabled()) {
  79. dtde.rejectDrag();
  80. return;
  81. }
  82. TreePath dropPath = tree.getClosestPathForLocation(dtde
  83. .getLocation().x, dtde.getLocation().y);
  84. TreeNode currentDropNode = (TreeNode) dropPath
  85. .getLastPathComponent();
  86. if (dropPath == null || currentDropNode == null
  87. || currentDropNode.equals(lastDragOverNode))
  88. return;
  89. else
  90. lastDragOverNode = currentDropNode;
  91. boolean mayDropHere = false;
  92. try {
  93. //这里取得传输数据是为了判断要放的位置合不合法
  94. TransferableTreeNode transferableNode = (TransferableTreeNode) dtde
  95. .getTransferable().getTransferData(
  96. TransferableTreeNode
  97. .getJavaJVMLocalObjectFlavor());
  98. JTree sourceTree = transferableNode.getSourceTree();
  99. MutableTreeNode sourceNode = (MutableTreeNode) transferableNode
  100. .getSourceNode();
  101. if (mayDropHere(sourceTree, sourceNode, dropPath)) {
  102. dropNode = (MutableTreeNode) dropPath
  103. .getLastPathComponent();
  104. if (!tree.isExpanded(dropPath))
  105. tree.expandPath(dropPath);
  106. mayDropHere = true;
  107. } else {
  108. dropNode = null;
  109. }
  110. } catch (Exception e) {
  111. e.printStackTrace();
  112. dropNode = null;
  113. }
  114. dndNode.setDropAllowed(mayDropHere);
  115. dndNode.setDropNode((TreeNode) dropPath.getLastPathComponent());
  116. tree.repaint();
  117. if (!mayDropHere)
  118. dtde.rejectDrag();
  119. else
  120. dtde.acceptDrag(dtde.getDropAction());
  121. tree.repaint();
  122. }
  123. public boolean mayDropHere(JTree sourceTree,
  124. MutableTreeNode sourceNode, TreePath dropPath) {
  125. if (dropPath == null)
  126. return false;
  127. return mayDropHere(sourceTree, sourceNode, (TreeNode) dropPath
  128. .getLastPathComponent());
  129. }
  130. public boolean mayDropHere(JTree sourceTree,
  131. MutableTreeNode sourceNode, TreeNode aNode) {
  132. boolean mayDropHere = (aNode != sourceNode)
  133. && (aNode instanceof MutableTreeNode)
  134. && ((aNode.getParent() == null) || (aNode.getParent() instanceof MutableTreeNode))
  135. && (tree.getModel() instanceof DefaultTreeModel)
  136. && !((tree == sourceTree) && isAncestorOf(sourceNode, aNode));
  137. return mayDropHere;
  138. }
  139. private boolean isAncestorOf(TreeNode aPossibleParent, TreeNode aNode) {
  140. if (aPossibleParent == null || aNode.getParent() == null)
  141. return false;
  142. else if (aNode.getParent() == aPossibleParent)//把父节点拖放都子节点上时
  143. return true;
  144. else
  145. return isAncestorOf(aPossibleParent, aNode.getParent());
  146. }
  147. //鼠标点击结束时才会执行
  148. public void drop(DropTargetDropEvent dtde) {
  149. System.out.println("drag-------------------");
  150. TreePath dropPath = tree.getClosestPathForLocation(dtde
  151. .getLocation().x, dtde.getLocation().y);
  152. if (!tree.isEnabled() || dropPath == null) {
  153. dtde.rejectDrop();
  154. dtde.dropComplete(false);
  155. resetDragAndDrop();
  156. return;
  157. }
  158. dropNode = (MutableTreeNode) dropPath.getLastPathComponent();
  159. try {
  160. dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
  161. TransferableTreeNode ttn = (TransferableTreeNode) dtde
  162. .getTransferable().getTransferData(
  163. TransferableTreeNode
  164. .getJavaJVMLocalObjectFlavor());
  165. JTree sourceTree = ttn.getSourceTree();
  166. MutableTreeNode sourceNode = (MutableTreeNode) ttn
  167. .getSourceNode();
  168. if (mayDropHere(sourceTree, sourceNode, dropNode)) {
  169. dtde
  170. .dropComplete(dropNodes(
  171. ttn.getSourceTree(),
  172. ttn.getSourceNode(),
  173. tree,
  174. dropNode,
  175. (dtde.getDropAction() & DnDConstants.ACTION_COPY_OR_MOVE) != 0));
  176. if (ttn.isWasExpand()) {
  177. DefaultTreeModel targetModel = (DefaultTreeModel) tree
  178. .getModel();
  179. System.out.println("树中该节点处的深度:" + targetModel.getPathToRoot(ttn.getSourceNode()).length);
  180. //如果从根节点到该节点的路径上的所有节点都不是叶子节点则都要把它展开,也就是能看到最后一个节点的子节点
  181. tree.expandPath(new TreePath(targetModel
  182. .getPathToRoot(ttn.getSourceNode())));
  183. }
  184. resetDragAndDrop();
  185. } else {
  186. try {
  187. dtde.rejectDrop();
  188. } catch (Exception e) {
  189. }
  190. dtde.dropComplete(false);
  191. resetDragAndDrop();
  192. return;
  193. }
  194. } catch (Exception e) {
  195. e.printStackTrace();
  196. dtde.rejectDrop();
  197. dtde.dropComplete(true);
  198. resetDragAndDrop();
  199. return;
  200. }
  201. }
  202. private boolean dropNodes(JTree aSourceTree,
  203. TreeNode treeNode, JTree aTargetTree,
  204. MutableTreeNode aDropNode, boolean move) {
  205. DefaultTreeModel sourceModel = (DefaultTreeModel) aSourceTree
  206. .getModel();
  207. DefaultTreeModel targetModel = (DefaultTreeModel) aTargetTree
  208. .getModel();
  209. MutableTreeNode sourceNodeCopy = (MutableTreeNode) treeNode;
  210. if (move) {
  211. sourceModel.removeNodeFromParent((MutableTreeNode) treeNode);
  212. }
  213. MutableTreeNode parent = (MutableTreeNode) aDropNode.getParent();
  214. if (aDropNode.isLeaf() && parent != null) {
  215. int index = parent.getIndex(aDropNode);
  216. // 把拖动的节点放在目标节点的下一个位置
  217. targetModel.insertNodeInto(sourceNodeCopy, parent, index + 1);
  218. } else {
  219. targetModel.insertNodeInto(sourceNodeCopy, aDropNode, 0);// aDropNode.getChildCount()
  220. // );
  221. }
  222. return true;
  223. }
  224. public void dropActionChanged(DropTargetDragEvent dtde) {
  225. }
  226. public void dragEnter(DropTargetDragEvent dtde) {
  227. dragOver(dtde);
  228. }
  229. public void dragExit(DropTargetEvent dte) {
  230. dropNode = null;
  231. dndNode.setDropNode(null);
  232. tree.repaint();
  233. }
  234. }
  235. public void resetDragAndDrop() {
  236. dropNode = null;
  237. dndNode.setDraggedNode(null);
  238. dndNode.setDropNode(null);
  239. dndNode.setDropAllowed(false);
  240. tree.repaint();
  241. }
  242. }