1

我知道我是个白痴,这就是为什么我无法弄清楚但我正在尝试使用paintComponent绘制一堆具有随机大小和位置的矩形。我试图确保所有这些都画在框架内。我可以使用以下代码(片段)来做到这一点,但我想知道是否有比我将数字硬编码到程序中更好的方法来做到这一点。有没有我应该看看的方法可能是我正在寻找的方法?

这是覆盖 paintComponent() 方法的内部类:

class DrawPanel extends JPanel {
    public void paintComponent(Graphics g) {
        int red = (int)(Math.random()*256);
        int blue = (int)(Math.random()*256);
        int green = (int)(Math.random()*256);

        g.setColor(new Color(red, blue, green));
        //The following 4 lines keep the rects within the frame
        //The frame is 500,500
        int ht = (int)(Math.random()*400);
        int wd = (int)(Math.random()*400);

        int x = (int)(Math.random()*100);
        int y = (int)(Math.random()*100);

        g.fillRect(x,y,ht,wd);
    }
}
4

3 回答 3

4

我想知道是否有比我将数字硬编码到程序中更好的方法。

就在这里

  • 调用getSize()封闭的 JPanel,即 DrawPanel,这样您就可以看到正在绘制的组件的实际边界。(编辑:或者getWidth()按照getHeight()卢卡斯的建议——1+ 对他的回答!)。
  • 此外,您通常会希望paintComponent(...)在孩子的覆盖中调用超级的方法。
  • 此外,您通常希望在其他地方进行随机化,例如在 DrawPanel 的构造函数中,以免每次重新调整 GUI 大小时都更改矩形。
于 2012-12-08T16:51:06.763 回答
4

DrawPanel您应该根据组件大小来确定坐标和大小。同样使用Random.nextInt代替Math.random()将更容易根据面板的当前大小保持在范围内:

Random random = new Random();
int ht = random.nextInt(getHeight());
int wd = random.nextInt(getWidth());

int x = random.nextInt(getWidth() - wd);
int y = random.nextInt(getHeight() - ht);
于 2012-12-08T16:53:29.323 回答
2

有一种方法可以获取您正在使用的面板的长度和宽度。

getHeight();
getWidth();

这些将返回您正在使用的 JPanel 的当前大小,这意味着如果您调整窗口大小,它实际上仍会在其中绘制它们。

http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html#getWidth ()

于 2012-12-08T16:51:39.493 回答