Applet AWT Canvas 未更新图形

Applet AWT Canvas not updating graphics

我正在尝试使用 Applets 编写基本绘图仪。我需要专门使用Applets。

对于polt,我已经单独创建了一个Canvas,但是我遇到了一个我无法解决的问题。当我第一次画任何图形时,它都画得很好。但是,canvas 之后没有正确重绘 - 我在调试屏幕中看到调用了 repaint() 方法并调用了 paint(),但没有更新图形。

代码如下:

public class MyCanvas extends Canvas{
int w,h;   //width and height
int samples;
ArrayList<Double> eqValues = new ArrayList<>();
MyCanvas(int wi, int he) //constructor
{ w=wi; h=he;
    setSize(w,h); //determine size of canvas
    samples=wi-20;
}
public void paint(Graphics g)
{
    int y0=0, y1; //previous and new function value
    g.setColor(Color.yellow);
    g.fillRect(0,0,w,h);   //clear canvas
    g.setColor(Color.black);
    if (eqValues.size()>0) { // draw new graph
        for (int t = 1; t <= samples; t = t + 1) {
            y1 = eqValues.get(t).intValue();
            g.drawLine(10 + t - 1, h  - y0, 10 + t, h  - y1);
            y0 = y1;
        }
    }
    System.out.println("Repainted");
    /*g.drawLine(10,10,10,h-10);   //y-axis
    g.drawLine(10,h/2,w-10,h/2); //x-axis
    g.drawString("P",w-12,h/2+15);
    g.drawString("P/2",w/2-13,h/2+15);
    g.drawLine(w-10,h/2-2,w-10,h/2+2); //horizontal marks
    g.drawLine(w/2, h/2-2,w/2, h/2+2);*/
}

public void drawSine(double amp, double xCoef, double phase){
    for (int j=0;j<=samples;j++){
        eqValues.add(amp*Math.sin(xCoef*Math.PI*j/samples + Math.PI*phase/180)+0.5+h/2);
    }
    repaint();
    System.out.println("Got sine vals");
}

public void drawFOeq(double sc, double fc){
    for (int j=0;j<=samples;j++){
        eqValues.add(sc*j+fc);
    }
    repaint();
    System.out.println("Got FO eq vals");
}
}

提前致谢!

问题是当您向 ArrayList 添加值时:您将它们放在 ArrayList 中已有的值之后(使用 add(Double) 方法)。如果您只想清除绘图并绘制新函数,请在添加新值之前在值的 ArrayList 中使用 clear() 方法:

public void drawSine(double amp, double xCoef, double phase) {
    eqValues.clear();    //this clear the ArrayList
    ......
    repaint();
    ......
}

public void drawFOeq(double sc, double fc){
    eqValues.clear();    //this clear the ArrayList
    ......
    repaint();
    ......
}

如果你想绘制多个函数,你必须创建不同的 ArrayList,或者更好的是,将所有点存储在 ArrayList 中(例如 java.awt.Point):

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.util.ArrayList;

public class MyCanvas extends Canvas {

    int w, h; // width and height
    int samples;
    ArrayList<Point> eqValues = new ArrayList<>();              //Point constructor receives 2 int arguments: x and y; however, his methods getX() and getY() return double values

    // constructor
    MyCanvas(int wi, int he) {
        w = wi;
        h = he;
        setSize(w, h);                                          // determine size of canvas
        samples = wi - 20;
    }

    public void paint(Graphics g) {
        int x1, y0, y1;                                         // previous and new function value

        g.setColor(Color.yellow);
        g.fillRect(0, 0, w, h);                                 // clear canvas

        g.setColor(Color.black);
        if (eqValues.size() > 0) {                              // draw new graph
            y0 = (int) Math.round(eqValues.get(0).getY());      // first line must start at the first point, not at 0,h
            for (Point p : eqValues) {                          // iterates over the ArrayList
                x1 = (int) Math.round(p.getX());
                y1 = (int) Math.round(p.getY());
                g.drawLine(10 + x1 - 1, h - y0, 10 + x1, h - y1);
                y0 = y1;
            }
        }

        System.out.println("Repainted");

    }

    public void drawSine(double amp, double xCoef, double phase) {
        for (int j = 0; j <= samples; j++) {
            eqValues.add(new Point(j, (int) Math
                    .round(amp * Math.sin(xCoef * Math.PI * j / samples + Math.PI * phase / 180) + 0.5 + h / 2)));
        }
        repaint();
        System.out.println("Got sine vals");
    }

    public void drawFOeq(double sc, double fc) {
        for (int j = 0; j <= samples; j++) {
            eqValues.add(new Point(j, (int) Math.round(sc * j + fc)));
        }
        repaint();
        System.out.println("Got FO eq vals");
    }
}