package com.hengyuan.hyoas.page.test;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
public class Tree implements ActionListener,TreeModelListener{
JLabel label=null;
JTree tree=null;
DefaultTreeModel treeModel=null;
String nodeName=null;//原有节点名称
public Tree(){
JFrame f=new JFrame("TreeTest");
Container contentPane=f.getContentPane();
DefaultMutableTreeNode root=new DefaultMutableTreeNode("菜单列表");
tree=new JTree(root);
tree.setEditable(true);
tree.addMouseListener(new MouseHandle());
treeModel=(DefaultTreeModel)tree.getModel();
treeModel.addTreeModelListener(this);
JScrollPane scrollPane=new JScrollPane();
scrollPane.setViewportView(tree);
JPanel panel=new JPanel();
JButton b=new JButton("新增节点");
b.addActionListener(this);
panel.add(b);
b=new JButton("删除节点");
b.addActionListener(this);
panel.add(b);
b=new JButton("清除所有节点");
b.addActionListener(this);
panel.add(b);
label=new JLabel("Action");
contentPane.add(panel,BorderLayout.NORTH);
contentPane.add(scrollPane,BorderLayout.CENTER);
contentPane.add(label,BorderLayout.SOUTH);
f.pack();
f.setVisible(true);
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}
//本方法运行新增、删除、清除所有节点的程序代码.
public void actionPerformed(ActionEvent ae){
if (ae.getActionCommand().equals("新增节点")){
DefaultMutableTreeNode parentNode=null;
DefaultMutableTreeNode newNode=new DefaultMutableTreeNode("新节点");
newNode.setAllowsChildren(true);
TreePath parentPath=tree.getSelectionPath();
//取得新节点的父节点
parentNode=(DefaultMutableTreeNode)(parentPath.getLastPathComponent());
//由DefaultTreeModel的insertNodeInto()方法增加新节点
treeModel.insertNodeInto(newNode,parentNode,parentNode.getChildCount());
//tree的scrollPathToVisible()方法在使Tree会自动展开文件夹以便显示所加入的新节点。若没加这行则加入的新节点
//会被 包在文件夹中,你必须自行展开文件夹才看得到。
tree.scrollPathToVisible(new TreePath(newNode.getPath()));
label.setText("新增节点成功");
}
if (ae.getActionCommand().equals("删除节点")){
TreePath treepath=tree.getSelectionPath();
if (treepath!=null){
//下面两行取得选取节点的父节点.
DefaultMutableTreeNode selectionNode=(DefaultMutableTreeNode)treepath.getLastPathComponent();
TreeNode parent=(TreeNode)selectionNode.getParent();
if (parent!=null) {
//由DefaultTreeModel的removeNodeFromParent()方法删除节点,包含它的子节点。
treeModel.removeNodeFromParent(selectionNode);
label.setText("删除节点成功");
}
}
}
if (ae.getActionCommand().equals("清除所有节点")){
//下面一行,由DefaultTreeModel的getRoot()方法取得根节点.
DefaultMutableTreeNode rootNode=(DefaultMutableTreeNode)treeModel.getRoot();
//下面一行删除所有子节点.
rootNode.removeAllChildren();
//删除完后务必运行DefaultTreeModel的reload()操作,整个Tree的节点才会真正被删除.
treeModel.reload();
label.setText("清除所有节点成功");
}
}
public void treeNodesChanged(TreeModelEvent e){
TreePath treePath=e.getTreePath();
DefaultMutableTreeNode node=(DefaultMutableTreeNode)treePath.getLastPathComponent();
try{
int[] index=e.getChildIndices();
node=(DefaultMutableTreeNode)node.getChildAt(index[0]);
}catch(NullPointerException exc){}
label.setText(nodeName+"更改数据为:"+(String)node.getUserObject());
}
public void treeNodesInserted(TreeModelEvent e){
System.out.println("new node insered");
}
public void treeNodesRemoved(TreeModelEvent e){
System.out.println("node deleted");
}
public void treeStructureChanged(TreeModelEvent e){
System.out.println("Structrue changed");
}
public static void main(String[] args){
new Tree();
}
class MouseHandle extends MouseAdapter{
public void mousePressed(MouseEvent e){
try{
JTree tree=(JTree)e.getSource();
int rowLocation=tree.getRowForLocation(e.getX(),e.getY());
TreePath treepath=tree.getPathForRow(rowLocation);
TreeNode treenode=(TreeNode)treepath.getLastPathComponent();
nodeName=treenode.toString();
}catch(NullPointerException ne){}
}
}
}
分享到:
相关推荐
在Java语言中,"BinaryTree.java" 通常是一个类文件,代表实现了二叉树结构的类。 在Java中实现二叉树,首先需要定义树节点的数据结构。一个典型的二叉树节点通常包含三个部分:节点数据值、指向左子节点的引用以及...
今日的主角是“Distribute Coins in Binary Tree.java”这一题解。这个题目的核心在于将二叉树中多余的硬币分发出去,以确保每个节点仅保留一个硬币。这个问题考察了对二叉树的遍历、递归思想、以及树上深度优先搜索...
import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Queue; public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; ...
本篇文章将详细解读Java语言解决LeetCode上的一个特定算法题——“Maximum Binary Tree”(最大二叉树)的解题过程。最大二叉树是指从给定的无序整数数组中构建出的一个二叉树,其中根节点的值是数组中最大的元素,...
在解决“Find Elements in a Contaminated Binary Tree”这类LeetCode题目时,首先要了解的是二叉树的数据结构和基本操作。二叉树是每个节点最多有两个子节点的树结构,分为左子节点和右子节点。而所谓的“污染的...
java代码实现平衡二叉树的增删查改
java面试算法/刷题
java面试算法/刷题
在给出的知识点中,我们将详细探讨如何利用Java语言解决这个问题。 首先,要解决这个问题,我们需要理解题目要求。问题通常描述为:给定一棵二叉树,找到与指定节点距离最近的叶子节点。这就意味着我们需要从目标...
All Nodes Distance K in Binary Tree不仅考察了对二叉树的深入理解,还考察了将树转换为图,并利用图搜索算法解决问题的能力。这要求解题者具备扎实的数据结构基础和算法知识,以及将理论知识灵活应用到实际编程...
在讲解Java解决LeetCode题库中“根据二叉树构造字符串”问题的题解时,我们首先要了解这个题目的具体要求。这个题目要求我们利用给定的二叉树来构造一个字符串。每个节点应该被表示为括号以及其对应的值。左子节点和...
在Java中,解决这个问题通常涉及到递归和二叉树节点的遍历。 在leetcode的题目中,这个问题被抽象为一个特定的算法问题,需要编写代码来实现这一功能。在Java语言中,可以利用其面向对象的特性,通过创建一个二叉树...
java 生成 Tree.htmjava 生成 Tree.htm
这个实例结合了多个技术,包括Accordion布局、Servlet、Struts2以及JSON数据交互,以及Ext.tree.Panel组件,以创建一个功能丰富的用户界面。 Accordion布局是ExtJS中的一个布局管理器,它允许在一个区域内组织多个...
本文将深入探讨如何用Java语言实现数据库中的二叉树查找,以"BinaryTree.java"为例,帮助你理解相关知识。 二叉树是由节点构成的数据结构,每个节点包含一个值以及最多两个子节点,分别称为左子节点和右子节点。...
AVLTree.java文件应该包含了AVL树的实现,包括节点类的定义、插入、删除、旋转等核心功能。通过阅读和理解这个源代码,你可以深入学习AVL树的原理和操作,这对于理解和使用自平衡二叉查找树是非常有价值的。在实际...
TreeBuilder.java
2. `sorttree.java`/`SortTreeServlet.java`:后台处理类,负责获取数据库中的分类数据并进行排序。 3. `Category.java`:分类对象的Java类,包含属性如ID、名称、父ID等。 4. `database.sql`/`categories.db`:...