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
属性,相反,您应该使用 getWidth
或 getHeight
确定小程序的实际大小
我还建议您看看:
- Java Plugin support deprecated and Moving to a Plugin-Free Web
- Painting in AWT and Swing
- Performing Custom Painting
- 2D Graphics
已更新
好吧,经过几次迭代后,我认为你实际上想做的是......
if (y < SIZE) {
g.fillRect(x, y, SIZE, DIST);
foregroundRec(x, y + DIST, c + 1, g);
}
我一直找不到这个问题的答案,所以希望有人能帮助我。
我正在做一项 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
属性,相反,您应该使用 getWidth
或 getHeight
确定小程序的实际大小
我还建议您看看:
- Java Plugin support deprecated and Moving to a Plugin-Free Web
- Painting in AWT and Swing
- Performing Custom Painting
- 2D Graphics
已更新
好吧,经过几次迭代后,我认为你实际上想做的是......
if (y < SIZE) {
g.fillRect(x, y, SIZE, DIST);
foregroundRec(x, y + DIST, c + 1, g);
}