Java 不在之前调用的方法之上绘制

Java paint not painting on top of previously called methods

我一直找不到这个问题的答案,所以希望有人能帮助我。

我正在做一项 class 作业,我必须在其中使用图形制作场景。到目前为止,我们只有两节关于图形的讲座,所以我几乎不熟悉。问题是她的方法没有按照首选顺序绘制。正如您在后面的代码中看到的那样,我有两种递归方法制作天空和草 background/foreground。最重要的是,我希望有一个十字(以及此后授予我的许多组件我可以解决这个问题),但是尽管这是在 paint 中调用的最后一个方法,但十字并没有像它应该出现的那样出现。

import java.awt.*;
import javax.swing.*;

public class DrawPicture extends JApplet
{
    public final int SIZE = 800;
    public final int DIST = 20;
    public Color bg1 = new Color(0, 200, 255);
    public Color bg2 = new Color(0, 175, 255);
    public Color grass1 = new Color(0, 220, 60);
    public Color grass2 = new Color(30, 255, 150);
    public Color brown = new Color(110, 80, 20);

    public void backgroundRec(int x, int y, int c, Graphics g)
    {
        if (c%2==0)
           g.setColor(bg1);
        else if (c%2==1)
           g.setColor(bg2);

        if (c < 40)
        {
            g.fillOval(x, y, SIZE, SIZE);
            backgroundRec(x, y - DIST, c+1, g);
        }
    }

    public void foregroundRec(int x, int y, int c, Graphics g)
    {
        if (c%2==0)
           g.setColor(grass1);
        else if (c%2==1)
           g.setColor(grass2);

        if (x < SIZE/2)
        {
            g.fillRect(x, y, SIZE, DIST);
            foregroundRec(x, y + DIST, c+1, g);
        }
    }

    public void cross(int x, int y, Graphics g)
    {
        g.setColor(brown);
        g.fillRect(SIZE/2, SIZE/2, 45, 275);
        g.fillRect(SIZE/2-50, SIZE/2+45, 150, 45);
    }

    public void paint(Graphics g)
    {
        //backgroundRec(0, 0, 0, g);
        //foregroundRec(0, 400, 0, g);
        cross(SIZE/2, SIZE/2, g);
    }
}

其中一个问题是,您在 foregroundRec 中有一个 WhosebugException,因为似乎没有什么可以阻止它更新,可能是因为您没有更改 [=13] 的值=].

我“认为”foregroundRec(x, y + DIST, c + 1, g); 应该是 foregroundRec(x + DIST, y + DIST, c + 1, g); 之类的 :P - 但根据您的代码,x 必须更改

您还应该在进行任何自己的绘画之前调用 super.paint,这可确保您最终不会出现任何奇怪的绘画伪影

您遇到的另一个问题是您依赖 SIZE 属性,相反,您应该使用 getWidthgetHeight确定小程序的实际大小

我还建议您看看:

已更新

好吧,经过几次迭代后,我认为你实际上想做的是......

if (y < SIZE) {
    g.fillRect(x, y, SIZE, DIST);
    foregroundRec(x, y + DIST, c + 1, g);
}