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

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

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

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

每当重写一个方法时,一定要使用@Override表示法。

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

您可能有兴趣阅读AWT和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()失败的情况下阻止了任何轻量级的子节点的出现。