public void poloyLine()
   {
   for(int i=0;i<xPoints.length;i++)
     {
       if(xPoints[i]>=800)
     {
        xPoints[i]=xPoints[i-1];
        yPoints[i]=yPoints[i-1];
     }else
       {
         xPoints[i] += 50;
       }
    }
    repaint();
   }
你这个算法有点问题。你上面的代码仅仅适合有一个点超出了800这个范围。而且你对y坐标的修改导致了数据不可能恢复。我的经验说给你,我也没有时间帮助你修改代码,你可以参考一下。
一般做这种曲线的时候,你需要做一个坐标变换,这样就可以保证你的曲线不会超出你的那个绘制区域。至于算法,就是吧你实际表示的数据,转换成屏幕的坐标。一般的方法是这样的。对于x轴,比如说一共是x个点,而你的x轴在屏幕上有y像素,那么对你的实际数据z的屏幕坐标可以这样计算。z*(y/x),当然你还需要考虑你的屏幕区局的原点坐标问题。如果你数学学的可以的话,这些应该不是什么问题,对于y舟也是一样的,这样你就保证,你的图形不会超出那个范围。。我只能这么帮助你了。

解决方案 »

  1.   

    poloyLine1()和poloyLine()有问题我还没有看完,但是可以解释出了左右边界,回去后就不能显示,
    和java.lang.ArrayIndexOutOfBoundsException异常。1. 你的原数据是xPoints和yPoints,可是在poloyLine1()和poloyLine()方法中改变了这两个数组的内容。
    2. 异常是因为poloyLine循环中的判断,但i=0时,i-1就回出错。
    3. 左移出Y轴后依然显示是因为poloyLine1中没有进行坐标判断,如果你依然用poloyLine方法中的判断,也会出现ArrayIndexOutOfBoundsException。这次是因为index大于数组长度。建议:
    1 移动显示判断是不要修改原数据。建立两个临时变量,保存要划线的数据。从这个方向入手,应该可以解决你的问题。
    至于ArrayIndexOutOfBoundsException,是数学问题,应该不难了。
      

  2.   

    谢谢你们的帮助,我基本已经解决了左右移动的功能,现在超出X,Y轴的范围的折线不会在显示,但是在向右移的时候,折线虽然不会在范围外显示,但是折线会落在和Y轴平行的最后一条网格线上,不知道是怎么回事,你们能不能帮我运行一下,看看究竟是怎么回事,代码如下:
    package 过程线;import java.awt.*;
    import java.applet.Applet;
    import javax.swing.*;
    import java.awt.font.*;
    import java.awt.Graphics;
    import java.awt.event.*;
    import java.util.*;
    import java.awt.Point;public class ProcessLine extends Applet implements KeyListener {
      String ParaTime;
      String ParaFlux;
      private boolean isStandalone = false;
      int[] xPoints = {
          0, 20, 30, 70, 190, 240, 300, 350, 400, 450, 500, 550, 600, 650,
          700};
      int[] yPoints = {
          280, 450, 100, 150, 250, 500, 240, 360, 500, 460, 460, 320, 200,
          450, 230};
      int[] xPointstmp = new int[xPoints.length];
      int[] yPointstmp = new int[yPoints.length];
      int[] xPointsshow = new int[xPoints.length];
      int[] yPointsshow = new int[yPoints.length];
      //Get a parameter value
      public String getParameter(String key, String def) {
        return isStandalone ? System.getProperty(key, def) :
            (getParameter(key) != null ? getParameter(key) : def);
      }  public void init() {
        try {
          ParaTime = this.getParameter("time", "");
        }
        catch (Exception e) {
          e.printStackTrace();
        }
        try {
          ParaFlux = this.getParameter("flux", "");
        }
        catch (Exception e) {
          e.printStackTrace();
        }
        //xPointstmp=xPoints;
        //yPointstmp=yPoints;
        for (int i = 0; i < xPoints.length; i++) {
          xPointstmp[i] = xPoints[i];
          yPointstmp[i] = yPoints[i];
        }
        xPointsshow = xPoints;
        yPointsshow = yPoints;
        addKeyListener(this);
        setFocusable(true);
      }  public String[][] getParameterInfo() {
        String[][] pinfo =
          {
          {"time", "String", ""},
          {"flux", "String", ""},
          };
        return pinfo;
      }  public void paint(Graphics g) {
        g.translate(100, 100);
        g.setColor(Color.black);
        g.drawLine(0, 0, 0, 510);
        g.drawLine(0, 510, 800, 510);
        //画网格
        g.setColor(Color.lightGray);
        int x = 0;
        int y = 0;
        int x1 = 0;
        int y1 = 0;    for (int i = 0; i < 16; i++) {
          x = 0;
          y += 30;
          x1 = 800;
          y1 += 30;
          g.drawLine(x, y, x1, y1);
          g.drawLine(0, 0, 800, 0);
        }
        int y2 = 0;
        int x2 = 0;
        int x3 = 0;
        int y3 = 510;    for (int j = 0; j < 16; j++) {
          x2 += 50;
          y2 = 0;
          x3 += 50;
          y3 = 510;
          g.drawLine(x2, y2, x3, y3);
        }    g.setColor(Color.red);
        g.drawPolyline(xPointsshow, yPointsshow, xPointsshow.length);
        //传递节点
        /*int xRect = -45;
           for(int i=0;i<50;i++){
          xRect +=45;
           }
           int yRect = 0;
           for(int i=0;i<50;i++){
         yRect = (int)(Math.random()*495);
           }
           int width = 10;
           int height = 10;
           g.setColor(Color.green);
           g.fill3DRect(xRect,yRect,width,height,true);*/    //传递流量
        int flux = -5;
        int xString = -20;
        int yString = 540;
        for (int i = 0; i < 18; i++) {
          xString = -20;
          yString -= 30;
          flux += 5;
          String s = String.valueOf(flux);
          g.setColor(Color.black);
          Font f = new Font("宋体", Font.BOLD, 14);
          g.setFont(f);
          g.drawString(s, xString, yString);
        }    //传递日期
        int month = 7;
        xString = -100;
        yString = 520;
        for (int i = 0; i <= 8; i++) {
          month = 7;
          xString += 100;
          yString = 520;
          g.setColor(Color.black);
          Font f = new Font("宋体", Font.BOLD, 14);
          g.setFont(f);
          String s1 = String.valueOf(month);
          g.drawString(s1, xString, yString);
        }
        int day = 1;
        xString = -80;
        yString = 520;
        for (int i = 0; i <= 8; i++) {
          day += 1;
          xString += 100;
          yString = 520;
          g.setColor(Color.black);
          Font f = new Font("宋体", Font.BOLD, 14);
          g.setFont(f);
          String s2 = String.valueOf(day);
          g.drawString(s2, xString, yString);
        }
        xString = -90;
        yString = 520;
        for (int i = 0; i <= 8; i++) {
          String s3 = "/";
          xString += 100;
          yString = 520;
          g.setColor(Color.black);
          Font f = new Font("宋体", Font.BOLD, 14);
          g.setFont(f);
          g.drawString(s3, xString, yString);
        }
      }  public void keyPressed(KeyEvent keyEvent) {
        JPanel panel = new JPanel();
        int keyCode = keyEvent.getKeyCode();
        if (keyCode == KeyEvent.VK_RIGHT) {
          poloyLineMove(50);//左移
        }
        else if (keyCode == KeyEvent.VK_LEFT) {
          poloyLineMove(-50);//右移
        }
      }  public void keyReleased(KeyEvent keyEvent) {
      }  public void keyTyped(KeyEvent keyEvent) {
        char keyChar = keyEvent.getKeyChar();
        if (keyChar == 'd') {
          poloyLineMove(50);
        }
        else if (keyChar == 'a') {
         poloyLineMove(-50);
        }
      }
      public void poloyLineMove(int MoveStep) {
       for (int i = 0; i < xPoints.length; i++) {
         xPointstmp[i] = xPointstmp[i] + MoveStep;
         xPointsshow[i] = xPointstmp[i];
         yPointsshow[i] = yPointstmp[i];
         if (xPointstmp[i] <= 0) {
           xPointsshow[i] = 0;
         }
         else {
           if (i > 0) {
             if (xPointstmp[i - 1] <= 0) {
               for (int k = 0; k < i; k++) {
                 yPointsshow[k] = yPointstmp[i - 1];
               }
             }
           }
           if (xPointstmp[i] >= 800) {
             xPointsshow[i] = 800;
           }
           else {
             if (i < xPoints.length - 1) {
               if (xPointstmp[i + 1] >= 800) {
                 for (int k = i; k < xPoints.length; k++) {
                   yPointsshow[k] = yPointstmp[i + 1];
                 }
               }
             }
           }
         }
         //System.out.println(xPointstmp[i]);
       }
       repaint();
     }
    }
    如果你们运行的话,点击左右光标键就会实现左右移动的功能,就会发现我上面说到的问题,我现在还有几个功能要实现,就是放大和缩小这条折线,你们也应该知道,放大缩小Y坐标是不变的,就是X坐标需要放大或缩小,放大是从我第一次显示的折线开始,缩小是从放大的那条折线开始到第一次显示的折线,他们同样也是可以左右移动的,而且折线在放大,缩小,左右移动的过程中,X轴的时间也是跟着改变的,至于折线每移动多少,时间改变多少,没有严格的要求,那位仁兄如果有时间的话,帮我想想,给点思路,最好能先帮我解决最上面说到的那个问题,再这里小弟先谢谢你们了!