Java学习之JTree(树)

        树状结构是一种常用的信息表现形式,它可以直观地显示出一组信息的层次结构。Swing中的JTree类用来创建树。

1、创建树

下面给出一个直观的显示:

这种树的形式可以折叠和展开。 一个树有一个root节点

        root = new DefaultMutableTreeNode("ROOT");//创建root节点
        DefaultMutableTreeNode nodeFirstA = new DefaultMutableTreeNode(
                "FirstA");//定义nodeFirstA节点
        nodeFirstA.add(new DefaultMutableTreeNode("SecondAA"));//nodeFirstA节点添加SecondAA
        nodeFirstA.add(new DefaultMutableTreeNode("SecondAB"));
        root.add(nodeFirstA);//root节点添加子节点nodeFirstA

        JTree tree = new JTree(root); //用root节点创建一个树
        getContentPane().add(tree, BorderLayout.CENTER);

树的一些属性设置,比如设置字体显示等

        tree.setRootVisible(false);// 不显示树的根节点
        tree.setRowHeight(20);// 树节点的行高为20像素
        tree.setFont(new Font("宋体", Font.BOLD, 14));// 设置树结点的字体
        tree.putClientProperty("JTree.lineStyle", "None");// 节点间不采用连接线
        DefaultTreeCellRenderer treeCellRenderer;// 获得树节点的绘制对象
        treeCellRenderer = (DefaultTreeCellRenderer) tree.getCellRenderer();
        treeCellRenderer.setLeafIcon(null);// 设置叶子节点不采用图标
        treeCellRenderer.setClosedIcon(null);// 设置节点折叠时不采用图标
        treeCellRenderer.setOpenIcon(null);// 设置节点展开时不采用图标

2、树的点击和展开

选中元素,分为单选,连续多选,任意多选

       treeSelectionModel.setSelectionMode(SINGLE_TREE_SELECTION);//单选

        treeSelectionModel.setSelectionMode(CONTIGUOUS_TREE_SELECTION);//连续多选
        treeSelectionModel.setSelectionMode(DISCONTIGUOUS_TREE_SELECTION);//任意多选

添加addTreeSelectionListener监听,然后输出选中节点值

tree.addTreeSelectionListener(new TreeSelectionListener() {
	public void valueChanged(TreeSelectionEvent e) {
		if (!tree.isSelectionEmpty()) {// 查看是否存在被选中的节点
			// 获得所有被选中节点的路径
			TreePath[] selectionPaths = tree.getSelectionPaths();
			for (int i = 0; i < selectionPaths.length; i++) {
				// 获得被选中节点的路径
				TreePath treePath = selectionPaths[i];
				// 以Object数组的形式返回该路径中所有节点的对象
				Object[] path = treePath.getPath();
				for (int j = 0; j < path.length; j++) {
					DefaultMutableTreeNode node;// 获得节点
					node = (DefaultMutableTreeNode) path[j];
					String s = node.getUserObject()
							+ (j == (path.length - 1) ? "" : "-->");
					System.out.print(s);// 输出节点标签
				}
				System.out.println();
			}
			System.out.println();
		}
	}
});

树的展开,可以出发事件,可以在事件中做一些处理,函数定义如下:
tree.addTreeExpansionListener(new TreeExpansionListener()// 捕获树节点已经被折叠的事件
public void treeExpanded(TreeExpansionEvent e) // 树节点已经被展开时触发

3、树的遍历

数据结构里面的概念,可以先序,中序,后序,层次,深度等遍历

            Enumeration<?> enumeration;// 声明节点枚举对象
            enumeration = root.preorderEnumeration(); 按前序遍历所有树节点

然后输出节点的值

            while (enumeration.hasMoreElements()) {// 遍历节点枚举对象
                DefaultMutableTreeNode node;// 获得节点
                node = (DefaultMutableTreeNode) enumeration.nextElement();
                // 根据节点级别输出占位符
                for (int l = 0; l < node.getLevel(); l++) {
                    System.out.print("----");
                }
                System.out.println(node.getUserObject());// 输出节点标签
            }

4、节点的增删改

增加节点insertNodeInto方法

DefaultMutableTreeNode node = new DefaultMutableTreeNode(
		textField.getText());// 创建欲添加节点
TreePath selectionPath = tree.getSelectionPath();// 获得选中的父节点路径
DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) selectionPath
		.getLastPathComponent();// 获得选中的父节点

System.out.println(parentNode.getChildCount());
treeModel.insertNodeInto(node, parentNode, parentNode
		.getChildCount());// 插入节点到所有子节点之后
TreePath path = selectionPath.pathByAddingChild(node);// 获得新添加节点的路径
if (!tree.isVisible(path))
	tree.makeVisible(path);// 如果该节点不可见则令其可见

修改节点nodeChanged:

TreePath selectionPath = tree.getSelectionPath();
DefaultMutableTreeNode node = (DefaultMutableTreeNode) selectionPath
		.getLastPathComponent();// 获得选中的欲修改节点
node.setUserObject(textField.getText());// 修改节点的用户标签
treeModel.nodeChanged(node);// 通知树模型该节点已经被修改
tree.setSelectionPath(selectionPath);// 选中被修改的节点

删除节点removeNodeFromParent:

DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree
		.getLastSelectedPathComponent();// 获得选中的欲删除节点
// 查看欲删除的节点是否为根节点,根节点不允许删除
if (!node.isRoot()) {
	DefaultMutableTreeNode nextSelectedNode = node
			.getNextSibling();// 获得下一个兄弟节点,以备选中
	if (nextSelectedNode == null)// 查看是否存在兄弟节点
		nextSelectedNode = (DefaultMutableTreeNode) node
				.getParent();// 如果不存在则选中其父节点
	treeModel.removeNodeFromParent(node);// 删除节点
	tree.setSelectionPath(new TreePath(nextSelectedNode
			.getPath()));// 选中节点
}

 

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值