6 绘制如下形式的一个二叉树。 程序代码: package tree; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.util.List; import javax.swing.JPanel; @SuppressWarnings(\public class TreePanel extends JPanel { private Node tree; //保存整棵树 private int nodeWidth = 20; //每个结点的宽度 private int nodeHeight = 20; //每个结点的高度 private int vDistance = 50; //每2个结点的垂直距离 private int hDIstance = 30; //每2个结点的水平距离 private int startY = 200; //根结点的Y,默认距离顶部200像素 private int startX = 0; //根结点的X,默认水平居中对齐 private int childAlignWays; //子对齐方式 public static int CHILD_ALIGN_ABSOLUTE = 0; //相对Panel居中 public static int CHILD_ALIGN_RELATIVE = 1; //相对父结点居中 private Font font = new Font(\微软雅黑\ //描述结点的字体 private Color nodeColor = Color.WHITE; //结点背景颜色 private Color linkLineColor = Color.BLACK; //结点连线颜色 private Color stringColor = Color.BLACK; //结点描述文字的颜色 // 默认构造 public TreePanel(){ this(null,CHILD_ALIGN_ABSOLUTE); } //根据传入的Node绘制树,以绝对居中的方式绘制 // @param n 要绘制的树 public TreePanel(Node n){
this(n,CHILD_ALIGN_ABSOLUTE); } /** 1 设置要绘制时候的对齐策略 2 @param childAlignWays 对齐策略 3 @see tree.TreePanel#CHILD_ALIGN_RELATIVE 4 @see tree.TreePanel#CHILD_ALIGN_ABSOLUTE */ public TreePanel(int childAlignWays){ this(null,childAlignWays); } /** 1根据子对齐策略childAlignWays绘制的树的根结点n 2 @param n 要绘制的树的根结点 3 @param childAlignWays 对齐策略 */ public TreePanel(Node n, int childAlignWays){ super(); //setTree(n); this.childAlignWays = childAlignWays; } /** 1 设置用于绘制的树 2 @param n 用于绘制的树的 */ public void setTree(Node n) { tree = n; } //重写,调用自己的绘制方法 public void paintComponent(Graphics g){ startX = (getWidth()-nodeWidth)/2; super.paintComponent(g); g.setFont(font); drawAllNode(tree, startX, g); } /** 1 递归绘制整棵树 2 @param n 被绘制的Node 3 @param xPos 根节点的绘制X位置 4 @param g 绘图上下文环境 */ public String toString() { return \} public void drawAllNode(Node n, int x, Graphics g){ int y = n.getLayer()*(vDistance+nodeHeight)+startY; int fontY = y + nodeHeight - 4; g.setColor(nodeColor); g.fillRect(x, y, nodeWidth, nodeHeight); //画结点的格子
g.setColor(stringColor); g.drawString(n.getName(), x, fontY); //画结点的名字 if(n.hasChild()){ List
this.stringColor = stringColor; } public int getStartY() { return startY; } /** * 设置根结点的Y位置 * @param startY 根结点的Y位置 */ public void setStartY(int startY) { this.startY = startY; } public int getStartX() { return startX; } /** * 设置根结点的X位置 * @param startX 根结点的X位置 */ public void setStartX(int startX) { this.startX = startX; } } package tree.demo; import java.awt.BorderLayout; import java.awt.GridLayout; import javax.swing.JFrame; import javax.swing.JPanel; import tree.Node; import tree.TreePanel; public class TestDrawTree extends JFrame{ public TestDrawTree(){ super(\ initComponents(); } public void initComponents(){ //初始化树的数据 Node floor0 = new Node(\ Node floor11 = new Node(\ Node floor12 = new Node(\ floor0.add(floor11); floor0.add(floor12);
Node floor21 = new Node(\ Node floor22 = new Node(\ floor11.add(floor21); floor11.add(floor22); Node floor31 = new Node(\ Node floor32 = new Node(\ floor21.add(floor31); floor21.add(floor32); Node floor41 = new Node(\ Node floor42 = new Node(\ floor32.add(floor41); floor32.add(floor42); floor0.printAllNode(floor0); //输出树 // 创建一个用于绘制树的面板并将树传入,使用相对对齐方式 TreePanel panel1 = new TreePanel(TreePanel.CHILD_ALIGN_RELATIVE); panel1.setTree(floor0); JPanel contentPane = new JPanel(); contentPane.setLayout(new GridLayout(1,1)); contentPane.add(panel1); add(contentPane,BorderLayout.CENTER); } public static void main(String[] args){ TestDrawTree frame = new TestDrawTree(); frame.setSize(800, 800); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }
运行结果贴图: