将矩形保持在JFrame中

时间:2012-12-08 16:42:22

标签: java swing user-interface jframe paintcomponent

我知道我是个白痴,这就是为什么我无法解决这个问题但是我想用paintComponent绘制一堆带有random大小和位置的矩形。我试图确保所有这些都被画在框架内。我能够使用以下代码(片段)来完成它,但我想知道是否有更好的方法来做到这一点,而不是硬编码数字到程序中。有没有一种方法我应该看一下,这可能是我正在寻找的东西?

这是覆盖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);
    }
}

3 个答案:

答案 0 :(得分:4)

  

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

是的,有

  • 在封闭的JPanel(DrawPanel)上调用getSize(),以便您可以看到正在绘制的组件的实际边界。 (编辑:或getWidth()getHeight()按照卢卡斯的建议 - 1+给他答案!)。
  • 此外,您通常希望在孩子的覆盖范围内调用超级paintComponent(...)方法。
  • 此外,您通常希望在其他地方进行随机化,例如在DrawPanel的构造函数中,以便每次重新调整GUI大小时都不会更改矩形。

答案 1 :(得分: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);

答案 2 :(得分:2)

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

getHeight();
getWidth();

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

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