/*画图形重载 */
    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);
        }
    }

解决方案 »

  1.   

    //draw the line
            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&&current.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&&current.needRepaint)
                repaint();
         }
        }  }//*****************************MY Program*********************