Java:使用递归绘制圆圈

时间:2014-03-04 17:30:24

标签: java swing recursion jpanel paintcomponent

所以我试图让我的程序通过递归绘制圆圈。每次进入递归时,圆的半径应增加10.这是它应该是什么样的:enter image description here

但是当我运行此代码以在面板上绘图时:

class CirclePanel extends JPanel{
public int radius = 25;
int xPossition = 250;
int yPossition = 250;
    @Override
public void paintComponent(Graphics g){
    super.paintComponents(g);

    g.setColor(Color.BLUE);
    g.drawOval(250, 250, radius, radius);
    radius += 10;

    if (radius + 10 < 250){
    paintComponent(g);
    }
    }


}

我明白了:

enter image description here

如果将圆圈的中心点设置为常数250,为什么圆的中心点会发生变化?

3 个答案:

答案 0 :(得分:3)

因为documentation

上指定的
  

x - 要绘制的椭圆的左上角角的x坐标。

     

y - 要绘制的椭圆的左上角角的y坐标。

     

width - 要绘制的椭圆的宽度。

     

height - 要绘制的椭圆的高度。

如果x和y是圆心的坐标

,那么你的代码就可以了

您应该调整代码,如:

class CirclePanel extends JPanel{
  public int radius = 25;
  int xPossition = 250;
  int yPossition = 250;

  @Override
  public void paintComponent(Graphics g){
      super.paintComponents(g);
      g.setColor(Color.BLUE);
      g.drawOval(250-(radius/2), 250-(radius/2), radius, radius);
      radius += 10;

      if (radius + 10 < 250){
        paintComponent(g);
      }
  }
}

答案 1 :(得分:2)

drawOval接受左上角位置,宽度和高度,而不是中心位置和宽度和高度。

它应该是这样的:

public void paintComponent(Graphics g) {
    super.paintComponents(g);

    g.setColor(Color.BLUE);
    g.drawOval(250 - radius, 250 - radius, radius * 2, radius * 2);
    radius += 10;

    if (radius + 10 < 250) {
        paintComponent(g);
    }
}

答案 2 :(得分:1)

椭圆的中心相对于您在first two parameters中提供的椭圆的起始左上角。慢慢地将那些向上和向左移动到你的框架上,让它像你想要的那样展开,所以如果你将圆圈展开10个像素,减去并从左上角的x和y开始5个像素。