我在一些代码中发现了一个渲染错误,并找到了一种解决方法,但我想知道为什么我会得到不同的行为。在旧代码中,背景(有时)会呈现为白色,尽管调试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(...)在语义上是相同的。
我也考虑了不透明性属性,但是父轻量级组件和祖先重量级组件都使用相同的背景颜色,并且很明显这个组件具有不正确的行为(它是父组件所拥有的8个相同类型的组件中的一个-但只有到达这段代码的组件才有问题)。
我正在使用JDK 1.6.0_07 (当然是出于业务原因),如果这有帮助的话。
发布于 2011-05-04 16:33:22
以下是来自JavaDocs的信息-
通过用当前绘图图面的背景色填充指定的矩形来清除该矩形。此操作不使用当前的绘制模式。
从Java 1.1开始,屏幕外图像的背景颜色可能取决于系统。应用程序应该先使用setColor,然后使用fillRect,以确保将离屏图像清除为特定颜色。
如上所述,clearRect依赖于系统,并且不考虑getBackground()的值。
发布于 2012-11-05 05:41:42
区别在于:
https://stackoverflow.com/questions/5879884
复制相似问题