我在一些代码中发现了一个渲染错误,并且找到了一种解决方法,但是我想知道为什么我会得到不同的行为。在旧代码中,尽管调试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()的值。

10-06 07:02