【问题标题】:JPanel's paintComponent();JPanel 的paintComponent();
【发布时间】:2015-10-29 16:46:18
【问题描述】:

这是一个代码示例:

public class MyClass extends JPanel
{
      Image img;
      public MyClass(Image img) {
      this.img = img;
      }
      ...

      void paintComponent(Graphics g) {
           g.drawImage(img, 0, 0, this);
      }

      void someFunction() {
           img = (Image) inputStream.getObject();
      }
}

如果img 收到一个全新的Image 实例,paintComponent() 是否也会被自动调用?

另外,paint()repaint()方法在这种情况下有什么用处吗?

【问题讨论】:

  • 不,如果您为变量分配新值,Swing 将不会重新绘制。我建议查看custom painting in swing。在someFunction 你应该打电话给repaint
  • 请记住,被覆盖的paintComponent方法中的第一行代码必须super.paintComponent(g)。否则,你会得到不可预知的绘画文物。
  • 谢谢。我推断repaint() 在内部调用paintComponent(),对吗? @VGR:您介意解释一下为什么会这样吗?比如,超类'paintComponent()具体做什么?这些工件从何而来?
  • 是的,repaint() 会经过重新绘制组件的步骤,最终会到达paintComponent() 并绘制图像,请确保每次更新后面的数据时调用repaint()渲染,所以渲染匹配数据
  • Oracle 的 Painting in AWT and Swing 和 Java 教程的 A Closer Look at the Paint Mechanism 比我能解释得更好。至少,需要确保正确绘制背景。我相信它也执行了一些绘画优化,至少在某些平台上是这样。

标签: java swing


【解决方案1】:

没有。特别是更改Component 的变量或调用someFunction() 之类的方法不会隐式运行paintComponent(),除非该方法旨在执行此操作。例如,someFunction() 方法可以在每次调用时重新绘制,如下所示:

void someFunction() {
   img = (Image) inputStream.getObject();
   repaint();
}

但是你仍然必须在更改img 的任何地方调用repaint(),如果你经常这样做很容易出现错误。一种更流畅的方法(如果可能的话,它允许您在外部传递图像)是编写一个建议重绘的设置器。

public void setImage(Image img){
   this.img = img;
   repaint();
}

并使用此方法而不是直接更改变量。例如:

void someFunction() {
   setImage((Image) inputStream.getObject());
}

最后,repaint() 最终可能会调用paint(),但您通常不会直接调用paint(),因为repaint() 管理得更好。请参阅paint vs repaintPainting in AWT and Swing 了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    • 2021-04-14
    相关资源
    最近更新 更多