Swing中paint,paintComponent和paintComponents之间的区别

时间:2012-02-22 04:42:14

标签: java swing paintcomponent

Java Swing中paint()paintComponent()paintComponents()之间的实际差异是什么?

我试图理解Oracle文档中解释的内容,但我不清楚。

2 个答案:

答案 0 :(得分:36)

  • AWT,覆盖paint()
  • 摆动顶级容器(例如JAppletJFrameJWindowJDialog ..),覆盖paint()。但是,有一些很好的理由在TLC中绘画。也许是一个单独问题的主题。
  • Swing的其余部分,覆盖paintComponent()
  • 既不覆盖也不明确调用paintComponents(),将其留给API以在需要时调用它。

请务必在覆盖某个方法时使用@Override表示法。

这样做会暗示试图在paintComponent(..)中覆盖JFrame的问题(它没有这样的方法),这很常见。

答案 1 :(得分:17)

您可能有兴趣阅读Painting in AWT and Swing

引用:

  

适用于AWT轻量级组件的规则也适用于Swing组件 - 例如,在渲染时会调用paint() - 除了Swing进一步将paint()调用分为三个独立的方法,按以下顺序调用:

 protected void paintComponent(Graphics g)
protected void paintBorder(Graphics g)
protected void paintChildren(Graphics g)
  

Swing程序应覆盖paintComponent()而不是覆盖paint()。虽然API允许它,但通常没有理由覆盖paintBorder()或paintComponents()(如果你这样做,请确保你知道你正在做什么!)。这种因子使程序更容易仅覆盖它们需要扩展的部分绘画。例如,这解决了前面提到的AWT问题,其中调用super.paint()失败阻止了任何轻量级子代出现。