j2se树目录控件JTree的操作示例

右键添加、编辑、删除节点。

5种遍历节点的方法。


public class my_tree extends JFrame implements ActionListener,MouseListener{
	FlowLayout f1 = new FlowLayout();  
	//声明一个树
	JTree newtree = null;
	//声明树的根目录节点
	DefaultMutableTreeNode letter = new DefaultMutableTreeNode("LETTERS",true);
	//以下是一级节点或还有下级节点的节点
//	DefaultMutableTreeNode letterA = new DefaultMutableTreeNode("A",true);
//	DefaultMutableTreeNode letterB = new DefaultMutableTreeNode("B",true);
//	DefaultMutableTreeNode letterC = new DefaultMutableTreeNode("C",true);
//	DefaultMutableTreeNode letterC2 = new DefaultMutableTreeNode("C2",true);
	//声明一个model,把树的根目录放进model
	DefaultTreeModel model = new DefaultTreeModel(letter);
	//声明一个jp,在model里用于滚屏展开
	JPanel jp1 = new JPanel();
	JPanel jp2 = new JPanel();
	
	//声明按钮
//	JButton jb1 = new JButton("前序遍历节点");
//	JButton jb2 = new JButton("后序遍历节点");
//	JButton jb3 = new JButton("广度优先遍历");
//	JButton jb4 = new JButton("深度优先遍历");
//	JButton jb5 = new JButton("遍历直属子节点");
	
	//编辑树目录
	JPopupMenu popMenu;
	JMenuItem addItem;
	JMenuItem delItem;
	JMenuItem editItem;
	
	public static void main(String[] args) {
		my_tree mytree = new my_tree();

	}

	//构造函数
	public my_tree(){
		this.setLayout(f1);  
		f1.setAlignment(FlowLayout.LEFT); 
		//实例化树,把model放进去。
		newtree = new JTree(model);
		//布局和控件尺寸设定
		jp1.setLayout(new BoxLayout(jp1, BoxLayout.X_AXIS));
		jp1.setPreferredSize(new Dimension(700,400));
		
		
		jp1.add(new JScrollPane(newtree));
		//开始一层一层的放树
//		letter.add(letterA);
//		letter.add(letterB);
//		letterB.add( new DefaultMutableTreeNode ("b1 " ));
//		letterB.add( new DefaultMutableTreeNode ("b2 " ));
//		letter.add(letterC);
//		letterC.add(new DefaultMutableTreeNode ("c1 " ));
//		letterC.add(letterC2);
//		letterC.add(new DefaultMutableTreeNode ("c3 " ));
//		letterC2.add(new DefaultMutableTreeNode ("c21 " ));
//		letterC2.add(new DefaultMutableTreeNode ("c22 " ));
//		letterC2.add(new DefaultMutableTreeNode ("c23 " ));
		
//		
//		jb1.addActionListener(this);
//		jb1.setActionCommand("front");
//		jb2.addActionListener(this);
//		jb2.setActionCommand("back");
//		jb3.addActionListener(this);
//		jb3.setActionCommand("width");
//		jb4.addActionListener(this);
//		jb4.setActionCommand("deep");
//		jb5.addActionListener(this);
//		jb5.setActionCommand("body");
//		
		
//		
//		jp2.add(jb1);
//		jp2.add(jb2);
//		jp2.add(jb3);
//		jp2.add(jb4);
//		jp2.add(jb5);
		
		this.add(jp1);
//		this.add(jp2);
		
		
//		//此树可编辑
				newtree.setEditable(true);
				newtree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
				newtree.addMouseListener(this);
				newtree.setCellEditor(new DefaultTreeCellEditor(newtree, new DefaultTreeCellRenderer()));;

		//添加菜单项及事件
				popMenu = new JPopupMenu();
				addItem = new JMenuItem("添加");
				addItem.addActionListener(this);
				addItem.setActionCommand("insert");
				delItem = new JMenuItem("删除");
				delItem.addActionListener(this);
				delItem.setActionCommand("delete");
				editItem = new JMenuItem("修改");
				editItem.addActionListener(this);
				editItem.setActionCommand("update");
				popMenu.add(addItem);
				popMenu.add(delItem);
				popMenu.add(editItem);
		
		
		
		//给窗体设置标题  
        this.setTitle("树的使用");  
        //设置大小  
        this.setSize(320, 240);  
        //设置初始位置  
        this.setLocation(100, 200);  
        //设置当关闭窗口时jvm也退出。  
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
        //显示  
        this.setVisible(true); 
	}

	
	//点击按钮,从设定好的根节点(letter)开始遍历
	@Override
	public void actionPerformed(ActionEvent e) {

/*
 * 		根据选中的内容执行不同方式的遍历,遍历可以使用在其他功能中。在actionPerformed中遍历的操作和右键编辑操作有冲突。
		Enumeration enumeration = null ;
		
		if(e.getActionCommand().equals("front")){
			System.out.println("按了前序遍历按钮");
			enumeration = letter.preorderEnumeration();
		}
		else if(e.getActionCommand().equals("back")){
			System.out.println("按了后序遍历按钮");
			enumeration = letter.postorderEnumeration();
		}
		else if(e.getActionCommand().equals("width")){
			System.out.println("按了广度优先遍历按钮");
			enumeration = letter.breadthFirstEnumeration();
		}
		else if(e.getActionCommand().equals("deep")){
			System.out.println("按了深度优先遍历按钮");
			enumeration = letter.depthFirstEnumeration();
		}
		else if(e.getActionCommand().equals("body")){
			System.out.println("按了直接子节点遍历按钮");
			enumeration = letter.children();
		}
		
		while(enumeration.hasMoreElements()){
			DefaultMutableTreeNode node = (DefaultMutableTreeNode) enumeration.nextElement();
			for(int i = 0 ;i<node.getLevel();i++){
				System.out.println("---------");
			}
			System.out.println(node.getUserObject());
		}
	*/	
		//右键菜单的操作
		DefaultMutableTreeNode node = (DefaultMutableTreeNode) newtree.getLastSelectedPathComponent();
		
		if(e.getActionCommand().equals("insert")){
			System.out.println("执行:"+e.getActionCommand());
			((DefaultTreeModel)newtree.getModel()).insertNodeInto(new DefaultMutableTreeNode("my_tree"), node, node.getChildCount());
			newtree.expandPath(newtree.getSelectionPath());
		}
		else if(e.getActionCommand().equals("delete")){
			System.out.println("执行:"+e.getActionCommand());
			if(node.isRoot()){
				System.out.println("选中了根节点");
				return;
			}
			((DefaultTreeModel)newtree.getModel()).removeNodeFromParent(node);
		}
		else if(e.getActionCommand().equals("update")){
			System.out.println("执行:"+e.getActionCommand());
			newtree.startEditingAtPath(newtree.getSelectionPath());
		}
	}

	@Override
	public void mouseClicked(MouseEvent e) {
		// TODO Auto-generated method stub
		System.out.println("进入鼠标click监听");
	}

	@Override
	public void mousePressed(MouseEvent e) {
		System.out.println("进入鼠标点击监听");
		TreePath path = newtree.getPathForLocation(e.getX(), e.getY());
		if(path == null){
			//没有选中树的任何节点
			return;
		}
		newtree.setSelectionPath(path);
		if(e.getButton()==3){	//3是右键
			popMenu.show(newtree,e.getX(),e.getY());
		}
		
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		System.out.println("进入鼠标release监听");
		
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}
	
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你说我听海绵宝宝派大星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值