2012-02-22 67 views

回答

33
  • AWT,覆盖paint()
  • 摇摆顶层容器(例如:JApplet,JFrame,JWindow,JDialog ..),覆盖paint()。但是有一些很好的理由而不是涂在TLC。也许是一个单独问题的主题。
  • Swing的其余部分覆盖paintComponent()
  • 既不重写也不明确呼叫paintComponents(),将其留给API以在需要时调用它。

一定要在覆盖某个方法时使用@Override表示法。

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

+0

嗨,是构造函数完成执行后立即调用paint()函数吗? – GMsoF 2012-11-27 02:17:42

+0

或者我们必须手动调用repaint()? – GMsoF 2012-11-27 02:18:03

+1

@GMsoF'repaint()'将在需要时自动调用。如果动画,它可能也被明确地调用。尽管调用次数太多,但速度太快,并且一些调用会被合并(忽略)。 – 2012-11-27 03:29:02

15

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

引述:

适用于AWT的轻量级组件规则也适用于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()会阻止任何轻量级子项出现。

相关问题