`

Tree目录实现拖拽功能演示实例(DragAndDrop)

阅读更多
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragSource;
import java.awt.dnd.DragSourceContext;
import java.awt.dnd.DragSourceDragEvent;
import java.awt.dnd.DragSourceDropEvent;
import java.awt.dnd.DragSourceEvent;
import java.awt.dnd.DragSourceListener;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.io.IOException;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;

public class DragAndDrop extends JFrame {

	private static final long serialVersionUID = 1L;
	JScrollPane jScrollPane1 = new JScrollPane();
	JTextArea jTextArea1 = new JTextArea();

	public DragAndDrop() {
		try {
			jbInit();
		} catch (Exception exception) {
			exception.printStackTrace();
		}

		jScrollPane1.getViewport().setBackground(new Color(105, 38, 125));
		jTextArea1.setBackground(Color.orange);
		jTextArea1.setToolTipText("????");
		JTree jtr = new JTree();
		jtr.setBackground(Color.BLUE);
		jScrollPane1.getViewport().add(jtr);
		this.getContentPane().add(jTextArea1, BorderLayout.NORTH);
		this.getContentPane().add(jScrollPane1, BorderLayout.CENTER);

		DragSource dragSource = DragSource.getDefaultDragSource(); //创建拖拽源
		dragSource.createDefaultDragGestureRecognizer(jtr, DnDConstants.ACTION_COPY_OR_MOVE, new DragAndDropDragGestureListener()); //建立拖拽源和事件的联系
		new DropTarget(jTextArea1, new DragAndDropDropTargetListener());

	}

	private void jbInit() throws Exception {

	}

	public static void main(String[] args) {

		DragAndDrop dad = new DragAndDrop();
		dad.setTitle("拖拽演示");
		dad.setSize(400, 300);
		dad.setVisible(true);

	}
}

class DragAndDropDragGestureListener implements DragGestureListener {
	public void dragGestureRecognized(DragGestureEvent dge) {
		//将数据存储到Transferable中,然后通知组件开始调用startDrag()初始化
		JTree tree = (JTree) dge.getComponent();
		TreePath path = tree.getSelectionPath();
		if (path != null) {
			DefaultMutableTreeNode selection = (DefaultMutableTreeNode) path.getLastPathComponent();
			DragAndDropTransferable dragAndDropTransferable = new DragAndDropTransferable(selection);
			dge.startDrag(DragSource.DefaultCopyDrop, dragAndDropTransferable, new DragAndDropDragSourceListener());
		}
	}
}

class DragAndDropTransferable implements Transferable {
	private DefaultMutableTreeNode treeNode;

	DragAndDropTransferable(DefaultMutableTreeNode treeNode) {
		this.treeNode = treeNode;
	}

	static DataFlavor flavors[] = { DataFlavor.stringFlavor };

	public DataFlavor[] getTransferDataFlavors() {
		return flavors;
	}

	public boolean isDataFlavorSupported(DataFlavor flavor) {
		if (treeNode.getChildCount() == 0) {
			return true;
		}
		return false;
	}

	public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {

		return treeNode;

	}

}

class DragAndDropDragSourceListener implements DragSourceListener {
	public void dragDropEnd(DragSourceDropEvent dragSourceDropEvent) {
		if (dragSourceDropEvent.getDropSuccess()) {
			//拖拽动作结束的时候打印出移动节点的字符串
			int dropAction = dragSourceDropEvent.getDropAction();
			if (dropAction == DnDConstants.ACTION_MOVE) {
				System.out.println("MOVE: remove node");
			}
		}
	}

	public void dragEnter(DragSourceDragEvent dragSourceDragEvent) {
		DragSourceContext context = dragSourceDragEvent.getDragSourceContext();
		int dropAction = dragSourceDragEvent.getDropAction();
		if ((dropAction & DnDConstants.ACTION_COPY) != 0) {
			context.setCursor(DragSource.DefaultCopyDrop);
		} else if ((dropAction & DnDConstants.ACTION_MOVE) != 0) {
			context.setCursor(DragSource.DefaultMoveDrop);
		} else {
			context.setCursor(DragSource.DefaultCopyNoDrop);
		}
	}

	public void dragExit(DragSourceEvent dragSourceEvent) {
	}

	public void dragOver(DragSourceDragEvent dragSourceDragEvent) {
	}

	public void dropActionChanged(DragSourceDragEvent dragSourceDragEvent) {
	}
}

class DragAndDropDropTargetListener implements DropTargetListener {
	public void dragEnter(DropTargetDragEvent dtde) {

	}

	public void dragOver(DropTargetDragEvent dtde) {
	}

	public void dropActionChanged(DropTargetDragEvent dtde) {
	}

	public void dragExit(DropTargetEvent dte) {
	}

	public void drop(DropTargetDropEvent dtde) {
		Transferable tr = dtde.getTransferable();//使用该函数从Transferable对象中获取有用的数据
		String s = "";
		try {
			if (tr.isDataFlavorSupported(DataFlavor.stringFlavor)) {
				s = tr.getTransferData(DataFlavor.stringFlavor).toString();
			}
		} catch (Exception e) {

		}
		System.out.println(s);
		DropTarget c = (DropTarget) dtde.getSource();
		JTextArea d = (JTextArea) c.getComponent();
		if (s != null && s != "") {
			d.append(s + "\n");
		}
	}

}

 

分享到:
评论

相关推荐

    drag-drop-folder-tree.rar_Tree 菜单_drag drop java_drag-drop-fold

    在这个特定的实现中,"drag-drop"功能被集成到树形菜单中,使得用户能够通过拖动节点来重新组织或移动数据,这极大地提升了用户体验和操作效率。 "drag drop java"是Java编程语言中的一个特性,Java提供了Swing和...

    drag-drop-folder-tree(功能强大的动态树)

    "drag-drop-folder-tree" 是一个专为实现这种功能而设计的组件,它不仅具备基本的树形展示,还提供了额外的交互功能,如节点的拖放操作和右键点击菜单。 动态树的核心特点在于其动态性,这意味着树中的节点可以根据...

    基于vue、iview实现tree组件可拖拽、双击编辑

    实现节点拖拽功能需要结合Vue的响应式特性与HTML5的拖放API(Drag and Drop API)。首先,在`Tree`节点上设置`draggable`属性为`true`,然后注册`dragstart`、`dragenter`、`dragover`、`drop`和`dragend`等事件处理...

    js动态树合集(dtree,dhtmlxtree,drag-drop-tree)

    drag-drop-tree 是一个专门针对拖放功能的JavaScript库,允许用户通过拖拽操作来重新排列树的结构。这种库对于需要高度用户交互的应用非常有用,比如文件管理器或者任务管理器。拖放功能的实现涉及到HTML5的drag ...

    YUI3 实现overlay展开是tree,并且树节点可以拖拽-drag和drop

    在这个场景中,我们讨论的是如何使用`YUI3`实现一个特殊的组件——一个可展开的`Overlay`,它内部展示了一个树形结构(Tree),并且树节点支持拖放(Drag and Drop)功能。 首先,`Overlay`是`YUI3`中的一个基础...

    ExtJS4官方指南翻译:DragandDrop拖放/Grid组件/Tree组件/容器与布局

    在"ExtJS4官方指南翻译:DragandDrop拖放/Grid组件/Tree组件/容器与布局"中,我们将会探讨以下几个核心概念: 1. **Drag and Drop(拖放)**: ExtJS4提供了完善的拖放支持,允许用户通过鼠标操作在界面上移动元素...

    基于Vue实现可以拖拽的树形表格

    在Vue.js框架中实现一个可拖拽的树形表格是一项技术挑战,涉及到组件设计、事件处理、数据管理和DOM操作...在实际项目中,还可以考虑集成第三方库如`vuedraggable`,它封装了Drag and Drop API,简化了拖放功能的实现。

    flex中 Tree树节点内部拖动实例(此实例限制了什么节点可以拖动及拖动到什么位置)

    这个实例涉及的是在Flex中的Tree组件实现节点的内部拖放功能,这对于创建交互式用户界面,尤其是数据层级结构的展示非常有用。在本文中,我们将详细探讨如何在Flex的Tree组件中实现节点的拖放操作,并且限制可拖动的...

    树菜单拖拽功能带拖拽特效

    拖拽功能(Drag and Drop)则是指允许用户通过鼠标选择并移动元素到目标位置的技术。在树菜单中,拖拽功能使得用户可以方便地移动或复制节点,这对于数据管理来说非常实用。例如,用户可以轻松地调整文件夹结构,...

    A.Drag.and.Drop.List.Control

    本文将深入探讨如何在MFC环境中实现一个具有拖放功能的列表控件,即"A.Drag.and.Drop.List.Control"。 首先,我们需要了解MFC中的拖放操作基本原理。在MFC中,拖放功能是通过实现OleDragDrop和OleInitialize等接口...

    drag-drop-folder-tree.zip_ajax_dhtmlxtree dr_drop_tree_tree ja

    在这个特定的例子"drag-drop-folder-tree.zip_ajax_dhtmlxtree_dr_drop_tree_tree_ja"中,开发者利用JavaScript的特性实现了一个拖放功能,这在AJAX(Asynchronous JavaScript and XML)开发中非常常见。AJAX允许...

    easyui datagrid 拖拽到 tree

    要实现拖拽功能,我们需要利用EasyUI提供的drag and drop(DnD)功能。在本案例中,是从datagrid拖拽行到tree,这涉及到对`datagrid-dnd.js`文件的修改。这个文件是EasyUI官方提供的用于实现datagrid内部行拖拽的...

    VC.drag.tree.control.design.rar_VC 树形_drop_tree 拖拽_拖拽tree_树 拖拽

    "VC.drag.tree.control.design.rar"这个压缩包提供了一组代码资源,专门用于实现这样的功能。下面将详细介绍如何在VC++中设计和实现一个支持拖放操作的树形控件。 首先,我们需要理解拖放(Drag and Drop)的基本...

    MFC Tree Control 拖动实现

    在本教程中,我们将深入探讨如何在MFC中实现Tree Control的拖放功能,这是一项扩展功能,可以增加用户的交互性和操作便利性。 首先,拖放功能涉及到Windows的消息处理机制。在MFC中,我们通常需要重载某些成员函数...

    drag-drop-folder-tree.rar

    1. **HTML5 Drag and Drop API**: 这是实现拖放功能的基础,它允许开发者创建可拖动元素,并定义它们在何处可以被放置。HTML5中的`draggable`属性设置为`true`,即可使元素具有拖放功能。同时,通过监听`dragstart`...

    基于iView和he-tree-vue的一个拖拽树形组件

    3. **拖拽功能**:用户可以通过鼠标拖动节点改变树形结构,这种功能在组织结构、任务分配或者文件管理场景下非常实用,允许用户自由调整数据层次关系。 4. **增、删、改功能**:组件支持添加新的子节点、删除节点...

    jsTree实例,jsTree实例

    **jsTree 实例详解** jsTree 是一个流行的 JavaScript 库,专门用于创建、操作和展示交互式的树型结构。在 Web 开发中,它常被用于构建目录结构、组织数据或者构建导航菜单。jsTree 提供了丰富的 API 和多种主题,...

    JsTree 最详细教程及完整实例

    3. **拖放(Drag & Drop)**:通过 `dnd` 插件,用户可以轻松地移动节点,实现树的重新排序。 4. **搜索(Search)**:内置的搜索功能让用户快速定位到特定节点。 5. **异步加载(Lazy Loading)**:对于大型数据...

    dragtree(可拖动CTreeCtrl)

    本文将深入探讨如何实现一个具有拖放功能的`CTreeCtrl`,即`dragtree(可拖动CTreeCtrl)`,以及这一功能对用户界面交互性的重要提升。 拖放功能在现代用户界面设计中扮演着关键角色,它提供了直观且便捷的操作方式,...

    js 实现的Tree目录树

    在本案例中,"js 实现的Tree目录树"指的是利用JavaScript来创建一种数据结构——树形目录,这种结构常用于文件系统、组织数据或者构建用户界面,尤其是文件管理器等应用场景。 树形目录结构是一种模仿自然界中树的...

Global site tag (gtag.js) - Google Analytics