Java Swing中paint()
,paintComponent()
和paintComponents()
之间的实际差异是什么?
我试图理解Oracle文档中解释的内容,但我不清楚。
答案 0 :(得分:36)
paint()
。JApplet
,JFrame
,JWindow
,JDialog
..),覆盖paint()
。但是,有一些很好的理由不在TLC中绘画。也许是一个单独问题的主题。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()失败阻止了任何轻量级子代出现。