java 动态的给树添加新节点 望高手指点啊

java 动态的给树添加新节点 望高手指点啊,第1张

//先选中节点才能增加节点

import java.awt.*

import java.awt.event.*

import javax.swing.*

import javax.swing.event.*

import javax.swing.tree.*

public class TreeTest implements ActionListener,TreeModelListener{

JLabel label=null

JTree tree=null

DefaultTreeModel treeModel=null

String nodeName=null//原有节点名称

public TreeTest(){

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 TreeTest()

}

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){}

}

}

}

刚刚回答了一个类似的问题,以下代码供参考:

#include "stdio.h"

#include "stdlib.h"

#define OK 1

#define ERROR 0

#define OVERFLOW -2

typedef char TElemType

typedef int Status

typedef struct BiTNode { // 结点结构

TElemType data

struct BiTNode *lchild, *rchild

// 左右孩子指针

} BiTNode, *BiTree

//以下是建立二叉树存储结构,空节点输入作为#结束标识

Status CreateBiTree(BiTree &T) {

//请将该算法补充完整,参见第6章课件算法或课本

char ch

scanf("%c",&ch)

if(ch=='#') T=NULL

else{

if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))

exit(OVERFLOW)

T->data=ch

CreateBiTree(T->lchild)

CreateBiTree(T->rchild)

}

return OK

} // CreateBiTree

void Preorder(BiTree T)

{

if(T)

{

printf("%c",T->data)

Preorder(T->lchild)

Preorder(T->rchild)

}

}

void Inorder(BiTree T)

{ // 中序遍历二叉树

//请将该算法补充完整,参见第6章课件算法

if(T)

{

Inorder(T->lchild)

printf("%c",T->data)

Inorder(T->rchild)

}

}

void Postorder(BiTree T)

{ // 后序遍历二叉树

//请将该算法补充完整,参见第6章课件算法

if(T)

{

Postorder(T->lchild)

Postorder(T->rchild)

printf("%c",T->data)

}

}

//以下是求叶子结点数

void CountLeaf(BiTree T,int&count){

//请将该算法补充完整,参见第6章课件算法

if(T){

if((!T->lchild)&&(!T->rchild))

count++

CountLeaf(T->lchild,count)

CountLeaf(T->rchild,count)

}

}

//以下是求二叉树的深度

int Depth(BiTree T ){

//请将该算法补充完整,参见第6章课件算法

int depthval,depthLeft,depthRight

if(!T) depthval=0

else{

depthLeft = Depth(T->lchild)

depthRight = Depth(T->rchild)

if(depthLeft>depthRight)depthval = 1+depthLeft

else depthval = 1+depthRight

}

return depthval

}

void main(){

BiTree T

int s=0,d

printf("\n creat of the bitree:\n")

CreateBiTree(T)

printf("\n output result of Preorder:\n")

Preorder(T)

CountLeaf(T,s)

d=Depth(T)

printf("\n leaves=%d\n",s)

printf("\n depth=%d\n",d)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10000111.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-04
下一篇 2023-05-04

发表评论

登录后才能评论

评论列表(0条)

保存