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

时间:2017-04-23 04:25:42

标签: java swing graphics graphics2d

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

我正在做一个课程作业,我必须使用图形制作一个场景。到目前为止,我们只有两个关于图形的讲座,所以我不熟悉。问题是她的方法没有按首选顺序绘制。正如你在后面的代码中看到的那样,我有两个递归方法制作天空和草背景/前景。除此之外,我希望有一个十字架(以及之后授予的许多组件我可以解决这个问题),但十字架并没有出现,尽管它是在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);
    }
}

1 个答案:

答案 0 :(得分:0)

其中一个问题是,StackOverflowException中有foregroundRec,因为似乎没有任何内容可以阻止更新,可能是因为您没有更改{{1}的值}}

我&#34;思考&#34; x应为foregroundRec(x, y + DIST, c + 1, g);或其他内容:P - 但根据您的代码,foregroundRec(x + DIST, y + DIST, c + 1, g);必须更改

Example

在进行任何自己的绘画之前,你也应该打电话给x,这可以确保你不会得到任何奇怪的油漆文物

您遇到的另一个问题是,您依赖于super.paint媒体资源,而应该使用SIZEgetWidth来确定小程序的实际大小是什么

我还建议看看:

更新

好的,经过几次迭代后,我实际上认为你正在尝试做的是......

getHeight