Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java绘制不在以前调用的方法上绘制_Java_Swing_Graphics_Graphics2d - Fatal编程技术网

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

Java绘制不在以前调用的方法上绘制,java,swing,graphics,graphics2d,Java,Swing,Graphics,Graphics2d,我一直无法找到这个问题的答案,所以希望有人能帮助我 我正在做一个课堂作业,我必须用图形制作一个场景。到目前为止,我们只上过两堂关于图形的课,所以我对这门课不太熟悉。问题在于,she方法没有按照首选顺序绘制。正如您在下面的代码中所看到的,我有两个递归方法来创建天空和草地背景/前景。最重要的是,我希望有一个十字架(以及许多组件,此后我可以通过这个问题),但十字架并没有像它应该出现的那样,尽管它是在paint中调用的最后一个方法 import java.awt.*; import javax.swin

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

我正在做一个课堂作业,我必须用图形制作一个场景。到目前为止,我们只上过两堂关于图形的课,所以我对这门课不太熟悉。问题在于,she方法没有按照首选顺序绘制。正如您在下面的代码中所看到的,我有两个递归方法来创建天空和草地背景/前景。最重要的是,我希望有一个十字架(以及许多组件,此后我可以通过这个问题),但十字架并没有像它应该出现的那样,尽管它是在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);
    }
}
import java.awt.*;
导入javax.swing.*;
公共类DrawPicture扩展JApplet
{
公共最终整数大小=800;
公共最终国际区=20;
公共颜色bg1=新颜色(0,200,255);
公共颜色bg2=新颜色(0、175、255);
公共颜色1=新颜色(0,220,60);
公共颜色2=新颜色(30、255、150);
公共颜色棕色=新颜色(110,80,20);
公共无效背景记录(整数x,整数y,整数c,图形g)
{
如果(c%2==0)
g、 setColor(bg1);
否则如果(c%2==1)
g、 setColor(bg2);
如果(c<40)
{
g、 圆角(x,y,大小,大小);
背景记录(x,y区,c+1,g);
}
}
公共空间前景记录(整数x,整数y,整数c,图形g)
{
如果(c%2==0)
g、 setColor(grass1);
否则如果(c%2==1)
g、 setColor(grass2);
如果(x
问题之一是,
foregroundRec
中存在
StackOverflowException
,因为似乎没有任何东西阻止它更新,可能是因为您没有更改
x
的值

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

在您自己进行任何绘制之前,您还应该调用
super.paint
,这样可以确保不会出现任何奇怪的绘制工件

您遇到的另一个问题是,您依赖于
SIZE
属性,而应该使用
getWidth
getHeight
来确定小程序的实际大小

我还建议您看看:

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

if (y < SIZE) {
    g.fillRect(x, y, SIZE, DIST);
    foregroundRec(x, y + DIST, c + 1, g);
}
if(y
我强烈建议您查看和。然后我建议您查看和,以了解有关绘画工作原理的更多详细信息