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

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的拖拽都是这样的,只要实现这几个接口任何空间都可以进行拖拽的。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics