`
747017186
  • 浏览: 334304 次
社区版块
存档分类
最新评论

java jtree可拖拽的例子

 
阅读更多

jtree可拖拽节点到textare:

package com.sysc.xmleditor.core;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Point;
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.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;



public class JTreeTest {
	public static void main(String[] args) {
		//整体窗口的使用
		final JFrame jFrame=new JFrame("我的第一个窗体");
		jFrame.setSize(new Dimension(800, 500));//设置窗体的大小
		jFrame.setBackground(Color.BLACK);
		jFrame.setLocation(new Point(300, 300));//设置窗体显示的位置
		jFrame.setVisible(true);
		
		jFrame.setLayout(new FlowLayout());
		
		jFrame.addWindowListener(new WindowAdapter() {//加入关闭窗体事件
			@Override
			public void windowClosing(WindowEvent e) {
				// TODO Auto-generated method stub
				System.out.println("系统正在关闭");
				System.exit(0);
			}
		});
		
	   DefaultMutableTreeNode root  =   new  DefaultMutableTreeNode( " root ");//设置一个tree的根节点color
	   DefaultMutableTreeNode color  =   new  DefaultMutableTreeNode( " Color ");//设置一个tree的根节点color
	   DefaultMutableTreeNode gray  =   new  DefaultMutableTreeNode ( " Gray " );//设置另一个节点gray
	   color.add (gray);//把Gary加入到color
	   //设置各个节点子类、父类关系
	   DefaultMutableTreeNode red=new  DefaultMutableTreeNode ( " Red " );
	   color.add (red );
	   DefaultMutableTreeNode Lightgray=new  DefaultMutableTreeNode ( " Lightgray " );
	   gray.add (Lightgray );
	   DefaultMutableTreeNode Darkgray=new  DefaultMutableTreeNode ( " Darkgray " );
	   gray.add (Darkgray );
	   DefaultMutableTreeNode Green=new  DefaultMutableTreeNode ( " Green " );
	   color.add ( Green);
	   root.add(color);
	   
	   JTree example5  =   new  JTree (root);//初始化jtree,把根节点color传入
	   
	   jFrame.add(example5);//加入jframe面板
	   
	   JTextArea textArea=new JTextArea(20,20);
	   textArea.setBackground(Color.YELLOW);
	   
	   jFrame.add(textArea);
	   
	   DragSource dragSource=DragSource.getDefaultDragSource();//创建拖拽环境
	   
	   //设置拖拽组件,拖拽方式,拖拽数据准备传输
	   dragSource.createDefaultDragGestureRecognizer(example5, DnDConstants.ACTION_COPY_OR_MOVE , new MyDemoDragGestureListener());
	   
	   new DropTarget(textArea, new MyDemoDropTargetListener());//设置拖拽目的地的组件,上面所执行的操作
	}
}

/**
 * 从被拖拽组件当中得到退拽数据
 * @author Administrator
 *
 */
class MyDemoDragGestureListener implements DragGestureListener{
	@Override
	public void dragGestureRecognized(DragGestureEvent dge) {
		// TODO Auto-generated method stub
		JTree tree = (JTree) dge.getComponent();
        TreePath path = tree.getSelectionPath();
        if (path != null) {
            DefaultMutableTreeNode selection = (DefaultMutableTreeNode) path
                    .getLastPathComponent();
            
            //开始拖拽,保存拖拽数据,以及拖拽时候的鼠标样式
            dge.startDrag(DragSource.DefaultCopyDrop, new MyDemoTransferable(selection), new MyDemoDragSourceListener());
        }
	}
	
}

/**
 * 暂时存放拖放数据的地方
 * @author Administrator
 *
 */
class MyDemoTransferable implements Transferable {
	private DefaultMutableTreeNode treeNode;
	
	public MyDemoTransferable(DefaultMutableTreeNode treeNode){
		this.treeNode=treeNode;
	}

	@Override
	public Object getTransferData(DataFlavor arg0)
			throws UnsupportedFlavorException, IOException {
		// TODO Auto-generated method stub
		return treeNode;
	}

	static DataFlavor flavors[] = { DataFlavor.stringFlavor };
	@Override
	public DataFlavor[] getTransferDataFlavors() {
		// TODO Auto-generated method stub
		return flavors;
	}

	//是否支持指定数据flavors
	@Override
	public boolean isDataFlavorSupported(DataFlavor arg0) {
		// TODO Auto-generated method stub
		return true;
	}
}

/**
 * 设置拖拽鼠标样式的地方
 * @author Administrator
 *
 */
class  MyDemoDragSourceListener implements  DragSourceListener{

	@Override
	public void dragDropEnd(DragSourceDropEvent arg0) {
		// TODO Auto-generated method stub
		System.out.println("拖拽已完成"+arg0.getDropAction());
	}

	@Override
	public void dragEnter(DragSourceDragEvent arg0) {
		// TODO Auto-generated method stub
		System.out.println("进入拖拽位置"+arg0.getDropAction());
		
	 	DragSourceContext context = arg0.getDragSourceContext();
	 	context.setCursor(DragSource.DefaultMoveDrop);
	}

	@Override
	public void dragExit(DragSourceEvent arg0) {
		// TODO Auto-generated method stub
		System.out.println("离开拖拽位置");
		
		DragSourceContext context = arg0.getDragSourceContext();
		context.setCursor(DragSource.DefaultCopyDrop);
	}

	@Override
	public void dragOver(DragSourceDragEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void dropActionChanged(DragSourceDragEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	
}

/**
 * 拖拽目的地所执行的操作
 * @author Administrator
 *
 */
class MyDemoDropTargetListener implements DropTargetListener{

	@Override
	public void dragEnter(DropTargetDragEvent dtde) {
		// TODO Auto-generated method stub
		System.out.println("dsdsdsd");
		dtde.getDropTargetContext().getComponent().setBackground(Color.GRAY);
	}

	@Override
	public void dragExit(DropTargetEvent dte) {
		// TODO Auto-generated method stub
		dte.getDropTargetContext().getComponent().setBackground(Color.YELLOW);
	}

	@Override
	public void dragOver(DropTargetDragEvent dtde) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void drop(DropTargetDropEvent dtde) {
		// TODO Auto-generated method stub
		 Transferable tr = dtde.getTransferable();// 使用该函数从Transferable对象中获取有用的数据
	        String str = "";
	        try {
	            if (tr.isDataFlavorSupported(DataFlavor.stringFlavor)) {
	                str = tr.getTransferData(DataFlavor.stringFlavor).toString();
	            }
	        } catch (IOException ex) {
	        } catch (UnsupportedFlavorException ex) {
	        }
	        System.out.println(str);
	        DropTarget target = (DropTarget) dtde.getSource();
	        JTextArea filed = (JTextArea) target.getComponent();
	        if (str != null && str != "") {
	            filed.setText(filed.getText() + str);
	        }
	        dtde.getDropTargetContext().getComponent().setBackground(Color.YELLOW);
	        System.out.println("*********end*************");
	}

	@Override
	public void dropActionChanged(DropTargetDragEvent dtde) {
		// TODO Auto-generated method stub
		
	}
	
}

 

jtree可退拽节点到自身节点下面:

package com.sysc.xmleditor.core.utils;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Point;
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.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;

public class JTreeTest2 {
	public static void main(String[] args) {
		//整体窗口的使用
		final JFrame jFrame=new JFrame("我的第一个窗体");
		jFrame.setSize(new Dimension(800, 500));//设置窗体的大小
		jFrame.setBackground(Color.BLACK);
		jFrame.setLocation(new Point(300, 300));//设置窗体显示的位置
		jFrame.setVisible(true);
		
		jFrame.setLayout(new FlowLayout());
		
		jFrame.addWindowListener(new WindowAdapter() {//加入关闭窗体事件
			@Override
			public void windowClosing(WindowEvent e) {
				// TODO Auto-generated method stub
				System.out.println("系统正在关闭");
				System.exit(0);
			}
		});
		
	   DefaultMutableTreeNode root  =   new  DefaultMutableTreeNode( " root ");//设置一个tree的根节点color
	   DefaultMutableTreeNode color  =   new  DefaultMutableTreeNode( " Color ");//设置一个tree的根节点color
	   DefaultMutableTreeNode gray  =   new  DefaultMutableTreeNode ( " Gray " );//设置另一个节点gray
	   color.add (gray);//把Gary加入到color
	   //设置各个节点子类、父类关系
	   DefaultMutableTreeNode red=new  DefaultMutableTreeNode ( " Red " );
	   color.add (red );
	   DefaultMutableTreeNode Lightgray=new  DefaultMutableTreeNode ( " Lightgray " );
	   gray.add (Lightgray );
	   DefaultMutableTreeNode Darkgray=new  DefaultMutableTreeNode ( " Darkgray " );
	   gray.add (Darkgray );
	   DefaultMutableTreeNode Green=new  DefaultMutableTreeNode ( " Green " );
	   color.add ( Green);
	   root.add(color);
	   
	   JTree example5  =   new  JTree (root);//初始化jtree,把根节点color传入
	   
	   jFrame.add(example5);//加入jframe面板
	   
	   DragSource dragSource=DragSource.getDefaultDragSource();//创建拖拽环境
	   
	   //设置拖拽组件,拖拽方式,拖拽数据准备传输
	   dragSource.createDefaultDragGestureRecognizer(example5, DnDConstants.ACTION_COPY_OR_MOVE , new MyDemoDragGestureListener());
	   
	   new DropTarget(example5, new MyDemoDropTargetListener());//设置拖拽目的地的组件,上面所执行的操作
	}
}

/**
 * 从被拖拽组件当中得到退拽数据
 * @author Administrator
 *
 */
class MyDemoDragGestureListener implements DragGestureListener{
	@Override
	public void dragGestureRecognized(DragGestureEvent dge) {
		// TODO Auto-generated method stub
		JTree tree = (JTree) dge.getComponent();
        TreePath path = tree.getSelectionPath();
        if (path != null) {
            DefaultMutableTreeNode selectTreeNode = (DefaultMutableTreeNode) path
                    .getLastPathComponent();
            
            //开始拖拽,保存拖拽数据,以及拖拽时候的鼠标样式
            dge.startDrag(DragSource.DefaultCopyDrop, new MyDemoTransferable(selectTreeNode), new MyDemoDragSourceListener());
        }
	}
	
}

/**
 * 暂时存放拖放数据的地方
 * @author Administrator
 *
 */
class MyDemoTransferable implements Transferable {
	private DefaultMutableTreeNode treeNode;
	
	public MyDemoTransferable(DefaultMutableTreeNode treeNode){
		this.treeNode=treeNode;
	}

	@Override
	public Object getTransferData(DataFlavor arg0)
			throws UnsupportedFlavorException, IOException {
		// TODO Auto-generated method stub
		return treeNode;
	}

	static DataFlavor flavors[] = { DataFlavor.stringFlavor };
	@Override
	public DataFlavor[] getTransferDataFlavors() {
		// TODO Auto-generated method stub
		return flavors;
	}

	//是否支持指定数据flavors
	@Override
	public boolean isDataFlavorSupported(DataFlavor arg0) {
		// TODO Auto-generated method stub
		return true;
	}
}

/**
 * 设置拖拽鼠标样式的地方
 * @author Administrator
 *
 */
class  MyDemoDragSourceListener implements  DragSourceListener{

	@Override
	public void dragDropEnd(DragSourceDropEvent arg0) {
		// TODO Auto-generated method stub
	}

	@Override//进入拖拽
	public void dragEnter(DragSourceDragEvent arg0) {
		// TODO Auto-generated method stub
	 	DragSourceContext context = arg0.getDragSourceContext();
	 	System.out.println(context.getComponent());
	 	context.setCursor(DragSource.DefaultMoveDrop);
	}

	@Override//离开拖拽
	public void dragExit(DragSourceEvent arg0) {
		// TODO Auto-generated method stub
		DragSourceContext context = arg0.getDragSourceContext();
		context.setCursor(DragSource.DefaultCopyNoDrop);
	}

	@Override
	public void dragOver(DragSourceDragEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void dropActionChanged(DragSourceDragEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	
}

/**
 * 拖拽目的地所执行的操作
 * @author Administrator
 *
 */
class MyDemoDropTargetListener implements DropTargetListener{

	@Override
	public void dragEnter(DropTargetDragEvent dtde) {
		// TODO Auto-generated method stub
	}

	@Override
	public void dragExit(DropTargetEvent dte) {
		// TODO Auto-generated method stub
	}

	@Override//拖动过程中调用
	public void dragOver(DropTargetDragEvent dtde) {
		// TODO Auto-generated method stub
		DropTarget target = (DropTarget) dtde.getSource();
        JTree targetTree = (JTree) target.getComponent();
        TreePath treePath=targetTree.getPathForLocation(dtde.getLocation().x, dtde.getLocation().y);
        if(treePath!=null){
            targetTree.setSelectionPath(treePath);
        }
	}

	@Override//拖拽结束时候调用
	public void drop(DropTargetDropEvent dtde) {
		// TODO Auto-generated method stub
		 Transferable tr = dtde.getTransferable();// 使用该函数从Transferable对象中获取有用的数据
		 
		 DefaultMutableTreeNode yuanNode=null;//拖过来的节点
	        try {
	            if (tr.isDataFlavorSupported(DataFlavor.stringFlavor)) {
	            	yuanNode = (DefaultMutableTreeNode)tr.getTransferData(DataFlavor.stringFlavor);//从Transferable这里面得到
	            }
	        } catch (IOException ex) {
	        } catch (UnsupportedFlavorException ex) {
	        }
	        System.out.println("**********"+yuanNode.getUserObject());
	        
	        String str = "";
	        try {
	        	if (tr.isDataFlavorSupported(DataFlavor.stringFlavor)) {
	        		str = tr.getTransferData(DataFlavor.stringFlavor).toString();
	        	}
	        } catch (IOException ex) {
	        } catch (UnsupportedFlavorException ex) {
	        }
	        System.out.println(str);
	        
	        DropTarget target = (DropTarget) dtde.getSource();
	        JTree targetTree = (JTree) target.getComponent();
	        TreePath treePath=targetTree.getPathForLocation(dtde.getLocation().x, dtde.getLocation().y);
	        
	        TreePath t= new TreePath(yuanNode.getPath());
	        targetTree.setSelectionPath(t);
	        targetTree.removeSelectionPath(t);
	        
	        DefaultMutableTreeNode mudidi=(DefaultMutableTreeNode)treePath.getLastPathComponent();
	        mudidi.add(yuanNode);
	        
	        targetTree.updateUI();
	        
	        System.out.println("最后落脚的节点:"+treePath);
	        System.out.println("*********end*************");
	}

	@Override
	public void dropActionChanged(DropTargetDragEvent dtde) {
		// TODO Auto-generated method stub
		
	}
}

  DragSource dragSource=DragSource.getDefaultDragSource();//创建拖拽环境

  

  //设置拖拽组件,拖拽方式,拖拽数据准备传输

  dragSource.createDefaultDragGestureRecognizer(example5, DnDConstants.ACTION_COPY_OR_MOVE , new MyDemoDragGestureListener());

其中MyDemoDragGestureListener 里面有一个方法很重要:

  //开始拖拽,保存拖拽数据,以及拖拽时候的鼠标样式

            dge.startDrag(DragSource.DefaultCopyDrop, new MyDemoTransferable(selectTreeNode), new MyDemoDragSourceListener());

其中MyDemoTransferable 是传输被拖拽的数据。

MyDemoDragSourceListener是拖拽的时候鼠标的样式

 

 

 //MyDemoDropTargetListener是目的地控件所做的动作

  new DropTarget(example5, new MyDemoDropTargetListener());//设置拖拽目的地的组件,上面所执行的操作

 

要实现jtree的拖拽要实现4个接口即可:

DragGestureListener:准备要拖住数据其中startDrag方法很重要

 Transferable://被拖住对象存放数据的地方接口

DragSourceListener:鼠标拖拽的样式接口,鼠标在目的地“进入,经过,离开”的动作监控

DropTargetListener:拖拽目的地所执行的操作,被拖拽对象在目的地“进入、经过、离开”的动作监控

 

这样就可以实现jtree的拖拽了,其实java的拖拽都是这样的,只要实现这几个接口任何空间都可以进行拖拽的。

 

分享到:
评论

相关推荐

    JTree的例子,可以拖动节点

    这个例子展示了如何实现一个可拖动节点的`JTree`,这在用户界面设计中是一个常见且实用的功能,特别是在需要展示层次结构信息时。`JTree`允许用户通过拖放操作来重新排列节点,提高交互性和用户体验。 拖放(Drag ...

    JAVA JTREE JTABLE实例代码

    总之,JTree和JTable是Java GUI编程中不可或缺的工具,熟练掌握它们的使用能够极大地提升开发效率,提供用户友好的数据展示界面。通过实践和研究提供的实例代码,开发者可以深入理解这两个组件的工作原理,从而更好...

    (java) JTree控件的拖拽,拖动

    本篇文章将深入探讨如何在`JTree`中实现拖拽(Drag and Drop,简称DnD)功能,使用户能够通过拖动节点来重新组织树形结构。 首先,为了启用`JTree`的拖放功能,我们需要在`JTree`实例上注册一个`DragSource`和`...

    Java JTree+JTable应用

    这个例子可能包含一个`JTree`,其中每个节点代表一个文件或目录,展开节点可以查看其子目录或文件。 接着,我们讨论`JTable`。`JTable`是一个用于展示和编辑表格数据的组件。它使用`TableModel`接口来获取和设置...

    java中Jtree的使用

    Jtree的使用例子 这是类似qq的节点例子 帮助我们是简单地编码

    java组件之jtree使用

    ### Java组件之JTree使用详解 #### 一、引言 `JTree`是Java Swing中的一个重要组件,用于展示层次化的数据结构。它提供了一种直观的方式来表示具有层级关系的数据,例如文件系统的目录结构或者组织架构等。本文将...

    java代码-使用java解决JTree文件浏览的源代码

    java代码-使用java解决JTree文件浏览的源代码

    java使用jtree动态实现二叉树

    在Java编程中,`JTree`是Swing库中的一个组件,用于展示树形数据结构。这个组件在GUI(图形用户界面)应用中非常常见,因为它可以清晰地展示层次关系的数据,比如文件系统目录结构。在Java中动态实现二叉树,即在...

    java swing-jtree的用法

    Java Swing中的JTree组件是用来展示层次结构数据的可视化控件,它通常用于文件系统或组织结构的表示。JTree的核心是TreeNode接口,每个节点都对应一个TreeNode对象。TreeNode定义了一系列方法,如`getChildCount()`...

    java代码-使用java解决JTree JSON的源代码

    java代码-使用java解决JTree JSON的源代码 ——学习参考资料:仅用于个人学习使用!

    java Swing JTree的教程实例

    在例子中,使用了`FlowLayout`布局管理器将`JTree`添加到窗口中。 3. **节点的选中和信息获取**: JTree允许用户选择特定的节点。当用户选择节点时,可以通过监听`TreeSelectionListener`事件来获取选中的节点信息...

    java代码-使用java解决JTree访问XML的源代码

    java代码-使用java解决JTree访问XML的源代码 ——学习参考资料:仅用于个人学习使用!

    jtree 节点添加图片

    在Java Swing库中,JTree是一个非常有用的组件,它用于展示层次结构的数据,例如文件系统或组织结构。在你的项目中,你似乎正在探索如何在JTree的不同节点上显示特定的图片,这可以增强用户的视觉体验,使得界面更加...

    Java写的树状目录-JTree的例子练习

    在Java编程中,`JTree`是...总之,`JTree`是Java Swing中不可或缺的一部分,它为展示和操作层次化数据提供了强大而灵活的工具。通过深入学习和实践,开发者可以构建出功能丰富的图形用户界面,满足各种业务场景的需求。

    java代码-使用java解决XML2JTree的源代码

    java代码-使用java解决XML2JTree的源代码 ——学习参考资料:仅用于个人学习使用!

    90个java-swing基础例子.zip

    在这个"90个java-swing基础例子.zip"压缩包中,你将找到90个不同的示例,涵盖了Swing的基础用法,这对于学习和理解Swing的各种功能非常有帮助。 1. **Swing组件**:Swing 提供了许多组件,如按钮(JButton),文本框...

    java中JTree的简单应用

    总之,JTree是Java GUI编程中不可或缺的一部分,它提供了一种直观的方式来表示层次结构数据,使得用户能够方便地浏览和操作这些数据。通过理解和掌握JTree的使用,Java初学者可以提升自己的UI设计能力和数据展示技巧...

    java中JTree高级编程

    Java中的JTree组件是Swing库提供的一种用于展示树形数据结构的图形用户界面(GUI)元素。在Java中,JTree通常用于显示文件系统、应用程序的层次结构或任何具有层级关系的数据。JTree的高级编程涉及到多个方面,包括...

    javaJTree编程(源代码)

    Java JTree是Java Swing库中的一个组件,用于创建和展示树形数据结构。在Java图形用户界面(GUI)开发中,JTree常被用来显示文件系统、组织结构或任何层次结构的数据。本示例程序“javaJTree编程(源代码)”提供了一...

    JTable_JTree.rar_JTable Java_JTree JTable_jtree

    总之,`JTable`和`JTree`是Java Swing中不可或缺的组件,用于展示和操作表格及树形数据。通过理解和实践,开发者能够构建出交互性强、功能丰富的桌面应用程序。在“JTable_JTree.rar”中,你将找到相关的示例代码,...

Global site tag (gtag.js) - Google Analytics