2012-12-08 53 views
1

我知道我是一個白癡,這就是爲什麼我無法弄清楚,但我試圖用paintComponent繪製一堆具有隨機大小和位置的矩形。我試圖確保他們都被畫在框架內。我可以用下面的代碼(代碼片段)完成它,但我想知道是否有更好的方法來完成它,而不是將數字硬編碼到程序中。有沒有一種方法可以讓我看看這可能是我正在尋找的?在JFrame中保留矩形

這裏的內部類,它覆蓋的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); 
    } 
} 
+0

您遇到了什麼問題?你確定你想在'paintComponent(...)'中隨機化,這樣任何時候GUI因任何原因被重新繪製時,矩形將會改變。你確定你不想調用'super.paintComponent(...)'方法嗎? –

+1

另外,你不應該使用DrawPanel的'getSize()'而不使用JFrame的大小嗎?否則你忽略了它的標題欄等... –

+0

看到相關的例子[這裏](http://stackoverflow.com/q/9849950/230513)。 – trashgod

回答

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); 
+0

這就是我一直在尋找的。非常感謝。我已經提出了所有其他答案,因爲他們都有幫助,但是這固定了「問題」。 –

4

我想知道是否有更好的方式來做到這一點比我硬編碼到數字節目。

是的,有在封閉的JPanel,該DrawPanel

  • 呼叫getSize(),所以你可以看到正在繪製時組件的實際邊界。 (編輯:或getWidth()getHeight()盧卡斯推薦 - 1+他的回答!)。
  • 此外,您通常會想要在孩子的覆蓋範圍內調用超級的paintComponent(...)方法。
  • 此外,您通常還想在其他地方進行隨機化,例如在DrawPanel的構造函數中,以便每次重新調整GUI大小時都不要更改矩形。
+0

出於他的目的,不會調用getHeight()和getWidth()會更好,因爲getSize()返回一個Dimension? – Lucas

+0

@Lucas:或者可以很好地工作。順便提一下你的答案。 –

+0

的確,使用單獨的方法做起來會稍微簡單一些,但如果您知道自己是什麼東西,那麼使用getSize()可以更快地完成它。 – Lucas