package com.my;
import java.awt.BorderLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
public class SimpleJTree{
JFrame jf;
JTree tree;
DefaultTreeModel model;
DefaultMutableTreeNode root;
DefaultMutableTreeNode guangdong;
DefaultMutableTreeNode guangxi;
DefaultMutableTreeNode foshan;
DefaultMutableTreeNode shantou;
DefaultMutableTreeNode guilin;
DefaultMutableTreeNode nanning;
//定义需要别拖动的TreePath
TreePath movePath;
JButton addSiblingButton=new JButton("添加兄弟节点");
JButton addChildButton=new JButton("添加子节点");
JButton deleteButton=new JButton("删除节点");
JButton editButton=new JButton("编辑当前节点");
public void init(){
//依次创建树的所有节点
root=new DefaultMutableTreeNode("世界");
guangdong=new DefaultMutableTreeNode("中国");
guangxi=new DefaultMutableTreeNode("美国");
foshan=new DefaultMutableTreeNode("北京");
shantou=new DefaultMutableTreeNode("上海");
guilin=new DefaultMutableTreeNode("华盛顿");
nanning=new DefaultMutableTreeNode("纽约");
//通过add()方法建立树节点之间的父子关系
guangdong.add(foshan);
guangdong.add(shantou);
guangxi.add(guilin);
guangxi.add(nanning);
root.add(guangdong);
root.add(guangxi);
jf=new JFrame("可编辑的树");
tree=new JTree(root);
model=(DefaultTreeModel)tree.getModel();
tree.setEditable(true);
MouseListener ml=new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
TreePath tp=tree.getPathForLocation(e.getX(), e.getY());
if(tp!=null&&movePath!=null){
if(movePath.isDescendant(tp)&&movePath!=tp){
JOptionPane.showMessageDialog(jf, "目标节点是被移动节点的子节点,无法移动",
"非法操作", JOptionPane.ERROR_MESSAGE);
return;
}else if(movePath!=tp){
((DefaultMutableTreeNode)tp.getLastPathComponent())
.add((DefaultMutableTreeNode)movePath.getLastPathComponent());
movePath=null;
tree.updateUI();
}
}
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
TreePath tp=tree.getPathForLocation(e.getX(), e.getY());
if(tp!=null){
movePath=tp;
}
}
};
tree.addMouseListener(ml);
JPanel panel=new JPanel();
addSiblingButton.addActionListener(even->{
DefaultMutableTreeNode selectedNode=(DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
//如果节点为空则直接返回
if(selectedNode==null) return;
//获取选中节点的父节点
DefaultMutableTreeNode parent=(DefaultMutableTreeNode)selectedNode.getParent();
//如果父节点为空则直接放回
if(parent==null) return;
DefaultMutableTreeNode newNode=new DefaultMutableTreeNode("新节点");
//获取选中节点的选中索引
int selectedIndex=parent.getIndex(selectedNode);
model.insertNodeInto(newNode, parent, selectedIndex+1);
TreeNode[] nodes=model.getPathToRoot(newNode);
TreePath path=new TreePath(nodes);
tree.scrollPathToVisible(path);
});
panel.add(addSiblingButton);
addChildButton.addActionListener(even->{
DefaultMutableTreeNode selectedNode=(DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
if(selectedNode==null) return;
DefaultMutableTreeNode newNode=new DefaultMutableTreeNode("新节点");
selectedNode.add(newNode);
TreeNode[] nodes=model.getPathToRoot(newNode);
TreePath path=new TreePath(nodes);
tree.scrollPathToVisible(path);
tree.updateUI();
});
panel.add(addChildButton);
deleteButton.addActionListener(event->{
DefaultMutableTreeNode selectedNode=(DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
if(selectedNode!=null&&selectedNode.getParent()!=null)
{
model.removeNodeFromParent(selectedNode);
}
});
panel.add(deleteButton);
editButton.addActionListener(event->{
TreePath selectedPath=tree.getSelectionPath();
if(selectedPath!=null)
{
tree.startEditingAtPath(selectedPath);
}
});
panel.add(editButton);
jf.add(new JScrollPane(tree));
jf.add(panel,BorderLayout.SOUTH);
jf.pack();
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);
}
public static void main(String[] args) {
new SimpleJTree().init();
}
}
运行结果: