如何在随机坐标上绘制一个随机大小的圆圈,使圆圈完全可见?

时间:2015-07-03 05:43:18

标签: java swing random paintcomponent

代码:

Random rand = new Random();
JPanel mainPanel;

int randomSize = 0; 
int randomPositionX = 0;
int randomPositionY = 0;

final static int FRAME_HEIGHT = 500;
final static int FRAME_WIDTH  = 500;

final static int TITLE_BAR    = 30 ;

final static int MAX_SIZE     = 100;
final static int MIN_SIZE     = 10 ;

/* All the below code is put into a method */

mainPanel = new JPanel(){   
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.RED);
        g.fillOval(randomPositionY, randomPositionX, randomSize, randomSize);
    }
};

do{
    randomSize = rand.nextInt(MAX_SIZE) + 1;
}while(randomSize < MIN_SIZE);

do{
    randomPositionX = rand.nextInt(FRAME_WIDTH);
    randomPositionY = rand.nextInt(FRAME_HEIGHT);
}while((randomPositionX + randomSize > FRAME_WIDTH) || (randomPositionY + randomSize > FRAME_HEIGHT - TITLE_BAR));

repaint();

我想要的是具有随机大小的圆圈,使其最小尺寸为10,最大尺寸为100.圆圈也应该以随机坐标绘制,以使圆圈完全JPanel mainPanel内的可见

请注意,mainPanel将添加到使用setSize(FRAME_WIDTH, FRAME_HEIGHT);设置大小的JFrame。

但问题是,有时候,圆圈的一部分在JPanel的一半外面和一半:

SCREENSHOT

我哪里出错了?

1 个答案:

答案 0 :(得分:3)

  1. 当计算圆圈的位置时,你试图使用框架大小,当框架包含一个变量高标题栏和框架内嵌
  2. 你试图在不相关时使用框架大小,这是你应该使用的组件大小,因为它在你要绘制的mainPanel坐标上下文中
  3.   

    那么,我该如何解决这些问题?

    丢弃所有帧“填充”/“偏移”。 mainPanel拥有自己的坐标上下文(它的左上角将是0x0)并且它将在其父级的坐标上下文中,因此您不需要关心框架或它的插图。 / p>

    简化您的计算,例如......

    int randomSize = MIN_SIZE + (rand.nextInt(MAX_SIZE) + 1);
    
    int randomPositionX = rand.nextInt(getWidth() - randomSize);
    int randomPositionY = rand.nextInt(getHeight() - randomSize);
    

    应该允许您生成不会超出可视区域的结果,因为尺寸的最大范围是容器的当前尺寸减去所需的尺寸,请注意,如果可用尺寸小于{ {1}},您将遇到问题;)

    该示例每秒生成一个新圆

    Random Circles

    MAX_SIZE