java中的paintComponent什么时候被调用

2025-02-26 08:41:04
推荐回答(4个)
回答1:

  当java认为需要重新绘制组件的时候由java调用。

  例如在程序中repaint();或者程序窗口最小化,然后恢复。或者程序窗口被遮挡,又显现的时候。

  注意观察,这个方法是个受保护的方法,这就是说平常并不用管这个方法,这个方法只在需要继承paintComponent(一般是JFrame)的时候,重写方法,(也可以不重新方法,如果不需要改变绘制组件动作的话)。

  下面看这个方法的源代码
  public void paintComponents(Graphics g) {
  if (isShowing()) {
  GraphicsCallback.PaintAllCallback.getInstance().
  runComponents(component, g, GraphicsCallback.TWO_PASSES);
  }
  }
  会发现这个方法会调用一个Callback。而

  private PaintCallback() {}
  public void run(Component comp, Graphics cg) {
  comp.paint(cg);
  }

  发现这个callback 会调用comp.paint(cg);

  也就是说调用paintComponent(),归根究底还是调用了写的,paint()方法。

回答2:

1 - paint() 中调用 paintComponent(), paintBorder(), paintChildren()

2 - 最重要的区别是“双缓冲”。Swing 组件的 paint() 中实现了双缓冲,所以不要随便去覆写,会破坏双缓冲的,————建议的方式是覆写 paintComponent()

3 - 覆写 paint(),如果新方法没有去调用 paintChildren(),还会造成子控件不显示,鼠标移上去才显示

4 - 只有极少数的情况可能需要覆写 paint() 方法,通常是为了实现特殊的绘图效果,或者特殊的优化,比如 JViewport 覆写了 paint() 方法,使用“延迟重绘”的方式来合并当滚动条移动时一些特别频繁的重绘请求,等等。

5 - paint方法定义于Component类 awt画布就可以自己重写paint方法,达到自己的目的 paintComponent定义于JComponent类 JComponent类继承了Component类,JPanel类继承了JComponent类 所以在JPanel既有paint方法,又有paintComponent方法 但是paint方法被java开发程序员重写了,进行着大量的复杂工作,如图象缓冲,解决了awt画布的抖动等问题,所以这个方法是不能被重写的,否则你的程序没办法正常工作 于是java开发程序员写了paintComponent方法替代paint方法

回答3:

显示时被paint方法调用。
paint方法会调用paintComponent,paintBorder,paintChildren等方法。

回答4:

paintComponent在对象初始化的时候应该是没有被自动调用,应该时你自己使用该方法时调用