我在一些代码中发现了一个渲染错误,并且找到了一种解决方法,但是我想知道为什么我会得到不同的行为。在旧代码中,尽管调试getBackground()
会返回正确的颜色,但背景有时(有时)会呈现白色。
旧代码:
@Override
public void paint(Graphics g) {
// Stuff
g.setColor(getBackground());
g.clearRect(0, 0, width, height); // Obviously wrong.
// More stuff
}
新代码:
@Override
public void paint(Graphics g) {
// Stuff
g.setColor(getBackground());
g.drawRect(0, 0, width, height); // Correct usage with 'setColor' call.
// More stuff
}
正如我在代码中所述,很明显
setColor(getBackground())
对clearRect(...)
调用没有影响。但是我认为调用clearRect(...)
并先调用setColor(getBackground())
后跟drawRect(...)
在语义上是相同的。我还考虑了opaqueness属性,但是父级轻量级组件和祖先重量级组件均使用相同的背景色,很明显,该组件是行为不正确的组件(它是8种相同类型的组件之一)。组件归其父组件拥有-但是只有到达此代码部分的组件才有问题)。
如果有帮助,我正在使用JDK 1.6.0_07(当然是出于业务原因)。
最佳答案
这是来自JavaDocs的信息-
通过使用当前绘图表面的背景色填充指定的矩形来清除它。此操作不使用当前的绘画模式。
从Java 1.1开始,屏幕外图像的背景颜色可能取决于系统。应用程序应使用setColor和fillRect来确保将屏幕外图像清除为特定颜色。
如此暗示,clearRect取决于系统,并且不考虑getBackground()的值。