2012-08-23 42 views
0

我重寫JPanel的paintComponent()方法在屏幕上繪製一些東西。JPanel.getWidth()不準確。爲什麼?

這是什麼樣子:

JPanel

我用下面的代碼來設置裁剪區域。這樣可以使邊緣彎曲。

RoundRectangle2D r = new RoundRectangle2D.Double(0, 0, getWidth(), getHeight(), 100, 150); 
g.setClip(r); 

顯然,這是與窗口右側的一個問題。經進一步檢查,我發現JPanel的getWidth()方法沒有報告正確的數字。通常,它稍微偏離。例如:

Width = 500, getWidth() = 492 
Width = 1000, getWidth() = 992 
Width = 100, getWidth() = 192 
Width = 350, getWidth() = 342 
Width = 600, getWidth() = 592 

我的問題是,爲什麼會這樣一貫錯了嗎?爲什麼getHeight()是正確的?

如果沒有編程的方式來獲得真正的寬度,應我只需添加8

回答

3

首先,要小心剪裁。 repaint管理器在將剪貼矩形傳遞給組件時已經設置了裁剪矩形,並且最終可以在組件外部進行繪製(如果已經創建了自己的緩衝區,則可以將其自行排除)。

組件尺寸是基於0,這意味着所需的寬度是getWidth() - 1

這是相同的概念集合和數組。另外,雖然我在這裏,但您認爲窗口大小(比如500)將環繞在您的組件周圍。這是相反的方式。由於窗口邊界的原因,一個尺寸爲500的窗口會產生小於那個的窗口。

+0

感謝您的支持。當你問我是否創建了自己的緩衝區時,你是什麼意思? – Redandwhite

+0

如果您在'paintComponent'方法內部創建'BufferedImage'並使用'BufferedImage'的圖形上下文。如果沒有,你真的,真的,真的需要小心改變圖形剪輯 – MadProgrammer

+0

嗯..假設這個JPanel不包含任何組件,並且我僅僅使用它的圖形上下文作爲畫布,那麼我會造成什麼危害? – Redandwhite

相關問題