/*画图形重载 */
class JEditorPane_Draw_FSM extends JEditorPane { private java.util.ArrayList node_save_array=new java.util.ArrayList();//use to save the Nodeinfo
private java.util.ArrayList lineArrayList=new java.util.ArrayList();
private Node_Info current;//savd the tempNodeInfo
private Rectangle RectangleModel=new Rectangle(18, 17,5000, 400);//定义rectangle模型,作图区域(18, 17, 445, 370)
private int Height=(int)RectangleModel.getHeight();
private int Width=(int)RectangleModel.getWidth();
private int lowerLevelCounts=0,middleLevelCounts=0,hightLevelCounts=0;//记录不同层次的状态机数目 public void addLineToArrayList(){
Line2D line_one=null;
//
for(int k=0;k<node_save_array.size()-1;k++){
Ellipse2D ellipse=new Ellipse2D.Double();
Node_Info tmpNodeInfo=(Node_Info)node_save_array.get(k);
ellipse=tmpNodeInfo.node;
int start_x=(int)ellipse.getCenterX();
int start_y=(int)ellipse.getCenterY();
tmpNodeInfo=(Node_Info)node_save_array.get(k+1);
ellipse=tmpNodeInfo.node;
int end_x=(int)ellipse.getCenterX();
int end_y=(int)ellipse.getCenterY();
line_one=new Line2D.Double(start_x,start_y,end_x,end_y);
lineArrayList.add(k,line_one);
}
//*************
} public void addEcllipseToArrayLinkList(){
int lowLevelCount=0;
int middleLevelCount=0;
int hightLevelCount=0;
Node_Info tempNodeInfo=null; for(int j=0;j<node_save_array.size();j++){
int PointX=Width/2,PointY=0;//rectangle center coordinate
tempNodeInfo=(Node_Info)node_save_array.get(j);
if(tempNodeInfo.node_info.AlarmLever<=3){
Rectangle2D regtangel_one;
Ellipse2D ellipse=new Ellipse2D.Double();
PointX=lowLevelCount*70;
PointY=Height*7/8;
lowLevelCount++;
regtangel_one=new Rectangle2D.Double(PointX,PointY,40,30);
ellipse.setFrame(regtangel_one);
//链表中接点进行更新
tempNodeInfo.node=ellipse;
node_save_array.set(j,tempNodeInfo); }
if(tempNodeInfo.node_info.AlarmLever<=6&&tempNodeInfo.node_info.AlarmLever>=4){
Rectangle2D regtangel_one;
Ellipse2D ellipse=new Ellipse2D.Double();
PointX=middleLevelCount*70;
PointY=Height*3/5;
middleLevelCount++;
regtangel_one=new Rectangle2D.Double(PointX,PointY,40,30);
ellipse.setFrame(regtangel_one);
//链表中接点进行更新
tempNodeInfo.node=ellipse;
node_save_array.set(j,tempNodeInfo);
}
if(tempNodeInfo.node_info.AlarmLever>=7){
Rectangle2D regtangel_one;
Ellipse2D ellipse=new Ellipse2D.Double();
PointX=hightLevelCount*70;
PointY=Height*1/3;
hightLevelCount++;
regtangel_one=new Rectangle2D.Double(PointX,PointY,40,30);
ellipse.setFrame(regtangel_one);
//链表中接点进行更新
tempNodeInfo.node=ellipse;
node_save_array.set(j,tempNodeInfo);
}
}//end for
} public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2=(Graphics2D)g;
//draw three lines
g2.setPaint(Color.CYAN);
Line2D line_one=null;
for(int count=0;count<=3;count++){
line_one=new Line2D.Double(0,Height/4,Width,Height/4);
g2.draw(line_one);
line_one=new Line2D.Double(0,Height*2/4,Width,Height*2/4);
g2.draw(line_one);
line_one=new Line2D.Double(0,Height*3/4,Width,Height*3/4);
g2.draw(line_one); }
//draw the ecllipse
for(int count=0;count<node_save_array.size();count++){
Ellipse2D ellipse=new Ellipse2D.Double();
Node_Info tmpNodeInfo=(Node_Info)node_save_array.get(count);
ellipse=tmpNodeInfo.node;
if(tmpNodeInfo.node_info.AlarmLever<=3)
g2.setPaint(Color.GREEN);
if(tmpNodeInfo.node_info.AlarmLever<7&&tmpNodeInfo.node_info.AlarmLever>=4)
g2.setPaint(Color.BLUE);
if(tmpNodeInfo.node_info.AlarmLever>=7)
g2.setPaint(Color.RED);
g2.fill(ellipse);
//处理第一个命令
if(count==0)
g2.fill(ellipse.getBounds2D()); g2.setPaint(Color.BLACK);
if(tmpNodeInfo.needRepaint)//按下鼠标左键
g2.drawString(tmpNodeInfo.node_info.simplelinuxcommand,(int)ellipse.getCenterX(),(int)ellipse.getCenterY());
if(tmpNodeInfo.needCommandInfo){//按下鼠标右键
g2.setPaint(Color.BLACK);
g2.drawString(tmpNodeInfo.node_info.simplelinuxcommand,(int)ellipse.getCenterX(),(int)ellipse.getCenterY());
g2.setPaint(Color.cyan);
g2.drawString("test success!",(int)ellipse.getCenterX(),(int)ellipse.getCenterY()-40);
}
}
class JEditorPane_Draw_FSM extends JEditorPane { private java.util.ArrayList node_save_array=new java.util.ArrayList();//use to save the Nodeinfo
private java.util.ArrayList lineArrayList=new java.util.ArrayList();
private Node_Info current;//savd the tempNodeInfo
private Rectangle RectangleModel=new Rectangle(18, 17,5000, 400);//定义rectangle模型,作图区域(18, 17, 445, 370)
private int Height=(int)RectangleModel.getHeight();
private int Width=(int)RectangleModel.getWidth();
private int lowerLevelCounts=0,middleLevelCounts=0,hightLevelCounts=0;//记录不同层次的状态机数目 public void addLineToArrayList(){
Line2D line_one=null;
//
for(int k=0;k<node_save_array.size()-1;k++){
Ellipse2D ellipse=new Ellipse2D.Double();
Node_Info tmpNodeInfo=(Node_Info)node_save_array.get(k);
ellipse=tmpNodeInfo.node;
int start_x=(int)ellipse.getCenterX();
int start_y=(int)ellipse.getCenterY();
tmpNodeInfo=(Node_Info)node_save_array.get(k+1);
ellipse=tmpNodeInfo.node;
int end_x=(int)ellipse.getCenterX();
int end_y=(int)ellipse.getCenterY();
line_one=new Line2D.Double(start_x,start_y,end_x,end_y);
lineArrayList.add(k,line_one);
}
//*************
} public void addEcllipseToArrayLinkList(){
int lowLevelCount=0;
int middleLevelCount=0;
int hightLevelCount=0;
Node_Info tempNodeInfo=null; for(int j=0;j<node_save_array.size();j++){
int PointX=Width/2,PointY=0;//rectangle center coordinate
tempNodeInfo=(Node_Info)node_save_array.get(j);
if(tempNodeInfo.node_info.AlarmLever<=3){
Rectangle2D regtangel_one;
Ellipse2D ellipse=new Ellipse2D.Double();
PointX=lowLevelCount*70;
PointY=Height*7/8;
lowLevelCount++;
regtangel_one=new Rectangle2D.Double(PointX,PointY,40,30);
ellipse.setFrame(regtangel_one);
//链表中接点进行更新
tempNodeInfo.node=ellipse;
node_save_array.set(j,tempNodeInfo); }
if(tempNodeInfo.node_info.AlarmLever<=6&&tempNodeInfo.node_info.AlarmLever>=4){
Rectangle2D regtangel_one;
Ellipse2D ellipse=new Ellipse2D.Double();
PointX=middleLevelCount*70;
PointY=Height*3/5;
middleLevelCount++;
regtangel_one=new Rectangle2D.Double(PointX,PointY,40,30);
ellipse.setFrame(regtangel_one);
//链表中接点进行更新
tempNodeInfo.node=ellipse;
node_save_array.set(j,tempNodeInfo);
}
if(tempNodeInfo.node_info.AlarmLever>=7){
Rectangle2D regtangel_one;
Ellipse2D ellipse=new Ellipse2D.Double();
PointX=hightLevelCount*70;
PointY=Height*1/3;
hightLevelCount++;
regtangel_one=new Rectangle2D.Double(PointX,PointY,40,30);
ellipse.setFrame(regtangel_one);
//链表中接点进行更新
tempNodeInfo.node=ellipse;
node_save_array.set(j,tempNodeInfo);
}
}//end for
} public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2=(Graphics2D)g;
//draw three lines
g2.setPaint(Color.CYAN);
Line2D line_one=null;
for(int count=0;count<=3;count++){
line_one=new Line2D.Double(0,Height/4,Width,Height/4);
g2.draw(line_one);
line_one=new Line2D.Double(0,Height*2/4,Width,Height*2/4);
g2.draw(line_one);
line_one=new Line2D.Double(0,Height*3/4,Width,Height*3/4);
g2.draw(line_one); }
//draw the ecllipse
for(int count=0;count<node_save_array.size();count++){
Ellipse2D ellipse=new Ellipse2D.Double();
Node_Info tmpNodeInfo=(Node_Info)node_save_array.get(count);
ellipse=tmpNodeInfo.node;
if(tmpNodeInfo.node_info.AlarmLever<=3)
g2.setPaint(Color.GREEN);
if(tmpNodeInfo.node_info.AlarmLever<7&&tmpNodeInfo.node_info.AlarmLever>=4)
g2.setPaint(Color.BLUE);
if(tmpNodeInfo.node_info.AlarmLever>=7)
g2.setPaint(Color.RED);
g2.fill(ellipse);
//处理第一个命令
if(count==0)
g2.fill(ellipse.getBounds2D()); g2.setPaint(Color.BLACK);
if(tmpNodeInfo.needRepaint)//按下鼠标左键
g2.drawString(tmpNodeInfo.node_info.simplelinuxcommand,(int)ellipse.getCenterX(),(int)ellipse.getCenterY());
if(tmpNodeInfo.needCommandInfo){//按下鼠标右键
g2.setPaint(Color.BLACK);
g2.drawString(tmpNodeInfo.node_info.simplelinuxcommand,(int)ellipse.getCenterX(),(int)ellipse.getCenterY());
g2.setPaint(Color.cyan);
g2.drawString("test success!",(int)ellipse.getCenterX(),(int)ellipse.getCenterY()-40);
}
}
for(int k=0;k<node_save_array.size()-1;k++){
Node_Info tmpNodeInfo=(Node_Info)node_save_array.get(k);
if(tmpNodeInfo.needRepaint==true){//若需要更新
if(tmpNodeInfo.moveLine==false){//不需要移动直线
Line2D line=(Line2D)lineArrayList.get(k);
BasicStroke myStroke=new BasicStroke(3);
g2.setStroke(myStroke);
g2.draw(line);
}else{//需要移动直线
if(tmpNodeInfo.node_info.seq==0){//第一条
Line2D line=(Line2D)lineArrayList.get(0);
BasicStroke myStroke=new BasicStroke(3);
g2.setStroke(myStroke);
g2.draw(line);
}
if(tmpNodeInfo.node_info.seq==node_save_array.size()-1){//最后一条
Line2D line=(Line2D)lineArrayList.get(tmpNodeInfo.node_info.seq-1);
BasicStroke myStroke=new BasicStroke(3);
g2.setStroke(myStroke);
g2.draw(line);
}
if(tmpNodeInfo.node_info.seq!=0&&tmpNodeInfo.node_info.seq!=node_save_array.size()-1){//中间的直线
BasicStroke myStroke=new BasicStroke(3);
g2.setStroke(myStroke);
Line2D line=(Line2D)lineArrayList.get(tmpNodeInfo.node_info.seq-1);
g2.draw(line);
line=(Line2D)lineArrayList.get(tmpNodeInfo.node_info.seq);
g2.draw(line);
} }//移动直线处理完成
}
}//end for }
public JEditorPane_Draw_FSM(java.util.ArrayList tempArrayList) { //将要进行描述的状态序列保存在给定Array中
Node_Info tempnodeinfo;
for(int i=0;i<tempArrayList.size();i++){
tempnodeinfo=new Node_Info();
tempnodeinfo.node_info=(LinuxCommandEvaluate)tempArrayList.get(i);
if(tempnodeinfo.node_info.AlarmLever<=3) lowerLevelCounts++;
if(tempnodeinfo.node_info.AlarmLever<7&&tempnodeinfo.node_info.AlarmLever>=4) middleLevelCounts++;
if(tempnodeinfo.node_info.AlarmLever>=7) hightLevelCounts++;
node_save_array.add(tempnodeinfo);
}
/*测试参数是否正确
for(int i=0;i<node_save_array.size();i++){
LinuxCommandEvaluate test=((Node_Info)node_save_array.get(i)).node_info;
System.out.println("command:"+test.simplelinuxcommand+"seq"+test.seq);
}
*/ addEcllipseToArrayLinkList();//1
addLineToArrayList();//2
//加载鼠标事件
this.addMouseListener(new MouseHandler());
this.addMouseMotionListener(new MouseMotionHandler());
} //declare whether the mouse current position is in the node
public Node_Info find(Point2D p){
boolean findFlag=false;
Node_Info tempNode=null;
for(int i=0;i<node_save_array.size();i++){
tempNode=(Node_Info)node_save_array.get(i);
if(tempNode.node.contains(p))
{
findFlag=true;
break ;}
} if(findFlag)
return tempNode;
else
return null;
}//this class is used to describe the node infomation
public class Node_Info{
Ellipse2D node=null;
LinuxCommandEvaluate node_info;
boolean needRepaint=false;
boolean moveLine=false;
boolean needCommandInfo=false;
}
//deal with the mouse event
private class MouseHandler extends MouseAdapter{ public void mousePressed(MouseEvent e){
current = find(e.getPoint());
if (current != null&&e.getButton()==e.BUTTON1)//按下鼠标左键盘
current.needRepaint = true;
if(current!= null&¤t.needRepaint)
repaint(); } public void mouseClicked(MouseEvent e){
current = find(e.getPoint());
if(current!= null&&e.getButton()==e.BUTTON3)//如果按下一次右键
if(current.needCommandInfo)
current.needCommandInfo=false;
else
current.needCommandInfo=true;
repaint();
}
public void mouseReleased(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
} private class MouseMotionHandler implements MouseMotionListener{
public void mouseMoved(MouseEvent e){
current = find(e.getPoint());
if (current == null)
setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
else
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
repaint();
} public void mouseDragged(MouseEvent e){
current = find(e.getPoint());
if (current != null){
//对椭圆进行移动更新操作
Ellipse2D originEllipse=new Ellipse2D.Double();
Ellipse2D preEllipse=new Ellipse2D.Double();
Ellipse2D nextEllipse=new Ellipse2D.Double();
originEllipse.setFrame( e.getPoint().getX()-20,e.getPoint().getY()-15,40,30);
current.node=originEllipse;
node_save_array.set(current.node_info.seq,current);//更新数组接点
//对直线进行相关更新操作
if(current.node_info.seq==0){//更新与状态机初始接点相连接的第一条直线
Node_Info tmpNodeInfo=(Node_Info)node_save_array.get(1);
nextEllipse=tmpNodeInfo.node;
Line2D line=new Line2D.Double(e.getPoint().getX(),e.getPoint().getY(),nextEllipse.getCenterX(),nextEllipse.getCenterY());
lineArrayList.set(current.node_info.seq,line);
}else
if(current.node_info.seq==node_save_array.size()-1){//更新与状态机最后接点相连接的直线
Node_Info tmpNodeInfo=(Node_Info)node_save_array.get(node_save_array.size()-2);
preEllipse=tmpNodeInfo.node;
Line2D line=new Line2D.Double(preEllipse.getCenterX(),preEllipse.getCenterY(),e.getPoint().getX(),e.getPoint().getY());
lineArrayList.set(current.node_info.seq-1,line);
}else{//更新与中间状态相连接的直线 Node_Info tmpNodeInfo=(Node_Info)node_save_array.get(current.node_info.seq-1);//与此连接的前一个椭圆
preEllipse=tmpNodeInfo.node;
tmpNodeInfo=(Node_Info)node_save_array.get(current.node_info.seq+1);//与此连接的后一个椭圆
nextEllipse=tmpNodeInfo.node;
Line2D line_one=new Line2D.Double(preEllipse.getCenterX(),preEllipse.getCenterY(),e.getPoint().getX(),e.getPoint().getY());
lineArrayList.set(current.node_info.seq-1,line_one);
Line2D line_two=new Line2D.Double(e.getPoint().getX(),e.getPoint().getY(),nextEllipse.getCenterX(),nextEllipse.getCenterY());
lineArrayList.set(current.node_info.seq,line_two); }
current.needRepaint = true;
current.moveLine=true;
}
if(current!= null&¤t.needRepaint)
repaint();
}
} }//*****************************MY Program*********************