import java.awt.Color;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.Enumeration;
import javax.swing.JPanel;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
@SuppressWarnings("serial")
public class DrawFaultTree extends JPanel{
private DefaultTreeModel tree;
private ArrayList<Node> nodes;
private boolean flag = false;
public DrawFaultTree(DefaultTreeModel model, ArrayList<Node> equations){
tree = model;
nodes = equations;
}
public void setTreeModel(DefaultTreeModel model){
flag = true;
tree = model;
}
public void drawTree(){
repaint();
}
public void clear(){
flag = false;
repaint();
}
@SuppressWarnings("unchecked")
public void paint(Graphics gc){
super.paint(gc);
if(flag){
int x;
int y;
caculatePosition();
DefaultMutableTreeNode root = (DefaultMutableTreeNode)tree.getRoot();
DefaultMutableTreeNode firstLeaf = root.getFirstLeaf();
adjustSubTree(root,-getPosition(firstLeaf));
Enumeration<DefaultMutableTreeNode> breadth = root.breadthFirstEnumeration();
while(breadth.hasMoreElements()){
DefaultMutableTreeNode nextNode = breadth.nextElement();
x = getPosition(nextNode);
y = nextNode.getLevel();
String name = (String)nextNode.getUserObject();
if(y == 0){
drawTopEvent(gc,name,x*35+50,y+20);
if(getGate(nextNode).equals("*"))
drawANDGate(gc,x*35+50,y*95+60);
else
drawORGate(gc,x*35+50,y*95+60);
}
else{
if(nextNode.isLeaf()){
drawBottomEvent(gc,name,x*35+50,y*95+10);
}
else{
drawMiddleEvent(gc,name,x*35+50,y*95+10);
if(getGate(nextNode).equals("*"))
drawANDGate(gc,x*35+50,y*95+60);
else
drawORGate(gc,x*35+50,y*95+60);
}
}
if(!nextNode.isLeaf()){
DefaultMutableTreeNode firstChild = (DefaultMutableTreeNode)nextNode.getChildAt(0);
DefaultMutableTreeNode lastChild = (DefaultMutableTreeNode)nextNode.getChildAt(nextNode.getChildCount()-1);
drawLine(gc,getPosition(firstChild)*35+50,(y+1)*95,getPosition(lastChild)*35+50,(y+1)*95);
}
}
}
}
public void setNodes(ArrayList<Node> equations){
nodes = equations;
}
@SuppressWarnings("unchecked")
public void caculatePosition(){
DefaultMutableTreeNode root = (DefaultMutableTreeNode)tree.getRoot();
Enumeration<DefaultMutableTreeNode> breadth = root.breadthFirstEnumeration();
int px = 0;
int childCount = 0;
int rx = 0;
int index = 0;
int distence = 0;
DefaultMutableTreeNode nextNode = null;
DefaultMutableTreeNode lastNode = null;
while(breadth.hasMoreElements()){
nextNode = breadth.nextElement();
if(!nextNode.isRoot()){
DefaultMutableTreeNode parent = (DefaultMutableTreeNode)nextNode.getParent();
px = getPosition(parent);
childCount = parent.getChildCount();
rx = childCount - 1;
index = parent.getIndex(nextNode);
setX(nextNode,(px-rx+index*2));
distence = getPosition(lastNode) - getPosition(nextNode) + 2;
if(lastNode.getLevel() == nextNode.getLevel() && distence > 0){
DefaultMutableTreeNode ancestor = (DefaultMutableTreeNode)nextNode.getSharedAncestor(lastNode);
for(int i = 0; i < ancestor.getChildCount(); i++){
DefaultMutableTreeNode child = (DefaultMutableTreeNode)ancestor.getChildAt(i);
if(child.isNodeDescendant(nextNode)){
adjustTree(ancestor,distence,i);
adjustX(ancestor,distence/2);
break;
}
}
while(!ancestor.isRoot()){
int i = ancestor.getParent().getIndex(ancestor);
ancestor = (DefaultMutableTreeNode)ancestor.getParent();
adjustTree(ancestor,distence,i+1);
adjustX(ancestor,distence/2);
}
}
}
lastNode = nextNode;
}
}
@SuppressWarnings("unchecked")
public void adjustSubTree(DefaultMutableTreeNode node, int x){
Enumeration<DefaultMutableTreeNode> breadth = node.breadthFirstEnumeration();
while(breadth.hasMoreElements()){
DefaultMutableTreeNode newNode = breadth.nextElement();
adjustX(newNode, x);
}
}
public void adjustTree(DefaultMutableTreeNode node, int x, int index){
int childCount = node.getChildCount();
for(int i = index; i < childCount; i++)
adjustSubTree((DefaultMutableTreeNode)node.getChildAt(i),x);
}
public void adjustX(DefaultMutableTreeNode node, int x){
String name = (String)node.getUserObject();
for(int i = 0; i < nodes.size(); i++){
Node newNode = nodes.get(i);
if(name.equals(newNode.name)){
newNode.x = newNode.x + x;
nodes.set(i,newNode);
return;
}
}
}
public void setX(DefaultMutableTreeNode node, int x){
String name = (String)node.getUserObject();
for(int i = 0; i < nodes.size(); i++){
Node newNode = nodes.get(i);
if(name.equals(newNode.name)){
newNode.x = x;
nodes.set(i,newNode);
return;
}
}
}
public int getPosition(DefaultMutableTreeNode node){
String name = (String)node.getUserObject();
for(int i = 0; i < nodes.size(); i++){
Node newNode = nodes.get(i);
if(name.equals(newNode.name)){
return newNode.x;
}
}
return 0;
}
public String getGate(DefaultMutableTreeNode node){
String name = (String)node.getUserObject();
for(int i = 0; i < nodes.size(); i++){
Node newNode = nodes.get(i);
if(name.equals(newNode.name)){
return newNode.gate;
}
}
return "*";
}
public void drawORGate(Graphics g, int x, int y){
g.setColor(Color.cyan);
g.fillArc(x-25, y, 50, 50, 0, 180);
g.setColor(Color.black);
g.drawArc(x-25, y, 50, 50, 0, 180);
g.drawLine(x-25, y+25, x+25, y+25);
g.drawLine(x-2,y+15,x+2,y+15);
g.drawLine(x,y+13,x,y+17);
g.drawLine(x, y+25, x, y+35);
}
public void drawANDGate(Graphics g, int x, int y){
g.setColor(Color.cyan);
g.fillArc(x-25, y, 50, 50, 0, 180);
g.setColor(Color.black);
g.drawArc(x-25, y, 50, 50, 0, 180);
g.drawLine(x-25, y+25, x+25, y+25);
g.fillOval(x-2, y+14, 5, 5);
g.drawLine(x, y+25, x, y+35);
}
public void drawBottomEvent(Graphics g, String name, int x, int y){
g.setColor(Color.cyan);
g.fillOval(x-15, y, 30, 30);
g.setColor(Color.black);
g.drawOval(x-15, y, 30, 30);
g.drawString(name,x-(5*name.length()/2),y+20);
g.drawLine(x, y-10, x, y);
}
public void drawMiddleEvent(Graphics g, String name, int x, int y){
g.setColor(Color.cyan);
g.fillRect(x-30, y, 60, 30);
g.setColor(Color.black);
g.drawRect(x-30, y, 60, 30);
g.drawString(name,x-(5*name.length()/2),y+20);
g.drawLine(x, y+30, x, y+50);
g.drawLine(x, y-10, x, y);
}
public void drawTopEvent(Graphics g, String name, int x, int y){
g.setColor(Color.cyan);
g.fillRect(x-50, y, 100, 20);
g.setColor(Color.black);
g.drawRect(x-50, y, 100, 20);
g.drawString(name,x-(5*name.length()/2),y+15);
g.drawLine(x, y+20, x, y+40);
}
public void drawLine(Graphics g, int x1, int y1, int x2, int y2){
g.drawLine(x1,y1,x2,y2);
}
}
评论2