2012-08-23 43 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

相关问题