import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;
import javax.swing.*;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
public class Main {
private static DefaultMutableTreeNode root;
public static void main(String args[]) {
JFrame f = new JFrame();
root = new DefaultMutableTreeNode("根节点");
DefaultMutableTreeNode root1 = new DefaultMutableTreeNode("子节点1");
DefaultMutableTreeNode root2 = new DefaultMutableTreeNode("子节点2");
DefaultMutableTreeNode root11 = new DefaultMutableTreeNode("二级子节点11", false);// 创建不许有子节点的二级节点
DefaultMutableTreeNode root22 = new DefaultMutableTreeNode("二级子节点22");
root.add(root1);
root.add(root2);
root1.add(root11);
root2.add(root22);
JTree tree = new JTree(root);
f.getContentPane().add(tree, BorderLayout.CENTER);
final JPanel panel = new JPanel();
panel.setLayout(new GridLayout(0, 1));
f.getContentPane().add(panel, BorderLayout.EAST);
final JButton button = new JButton("按前序遍历节点");
Main m = new Main();
ButtonActionListener b1 = m.new ButtonActionListener("按前序遍历");
button.addActionListener(b1);
panel.add(button);
final JButton button_1 = new JButton("按后序遍历节点");
ButtonActionListener b2 = m.new ButtonActionListener("按后序遍历");
button_1.addActionListener(b2);
panel.add(button_1);
final JButton button_2 = new JButton("以广度优先遍历");
ButtonActionListener b3 = m.new ButtonActionListener("以广度优先遍历");
button_2.addActionListener(b3);
panel.add(button_2);
final JButton button_3 = new JButton("以深度优先遍历");
ButtonActionListener b4 = m.new ButtonActionListener("以深度优先遍历");
button_3.addActionListener(b4);
panel.add(button_3);
final JButton button_4 = new JButton("遍历直属子节点");
ButtonActionListener b5 = m.new ButtonActionListener("遍历子节点");
button_4.addActionListener(b5);
panel.add(button_4);
TreeSelectionModel model = tree.getSelectionModel();
model.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);// 单选
// model.setSelectionMode(TreeSelectionModel.CONTIGUOUS_TREE_SELECTION);//连选
// model.setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);//多选
tree.addTreeSelectionListener(new TreeSelectionListener() {
@Override
public void valueChanged(TreeSelectionEvent e) {
JTree t = (JTree) e.getSource();
if (!t.isSelectionEmpty()) {// 查看是否存在被选中的节点
TreePath paths[] = t.getSelectionPaths();
for (TreePath path : paths) {
// System.out.println(path);
Object obj[] = path.getPath();// 获得被选中节点的路径
for (Object boj : obj) {
System.out.println(boj + " ");
}
System.out.println();
}
}
}
});
// tree.setRootVisible(false);//不显示根节点
// tree.setShowsRootHandles(true);//显示根节点小手柄
//定义小手柄图标
// DefaultTreeCellRenderer render = (DefaultTreeCellRenderer) tree.getCellRenderer();
// render.setLeafIcon(new ImageIcon("src/a.png"));
// render.setOpenIcon(new ImageIcon("src/a.png"));
// render.setClosedIcon(new ImageIcon("src/a.png"));
// tree.putClientProperty("JTree.lineStyle", "None");//不绘制节点间的连线
// tree.putClientProperty("JTree.lineStyle", "Horizontal");//绘制水平分栏线
f.setTitle("树");
f.setSize(800, 600);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
private class ButtonActionListener implements ActionListener {
private String mode;
public ButtonActionListener(String mode) {
this.mode = mode;
}
public void actionPerformed(ActionEvent e) {
Enumeration<?> enumeration;// 声明节点枚举对象
if (mode.equals("按前序遍历")) {
// 按前序遍历所有树节点
enumeration = root.preorderEnumeration();
}
else if (mode.equals("按后序遍历"))
// 按后序遍历所有树节点
enumeration = root.postorderEnumeration();
else if (mode.equals("以广度优先遍历"))
// 以广度优先遍历所有树节点
enumeration = root.breadthFirstEnumeration();
else if (mode.equals("以深度优先遍历"))
// 以深度优先遍历所有树节点
enumeration = root.depthFirstEnumeration();
else
enumeration = root.children(); // 遍历该节点的子节点
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());// 输出节点标签
}
System.out.println();
System.out.println();
}
}
}
运行结果:
button点击:
点击节点: