右键添加、编辑、删除节点。
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
}
}