java中的paintComponent啥时候被调用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中的paintComponent啥时候被调用相关的知识,希望对你有一定的参考价值。

  当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()方法。
参考技术A 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方法
参考技术B 显示时被paint方法调用。
paint方法会调用paintComponent,paintBorder,paintChildren等方法。
参考技术C paintComponent在对象初始化的时候应该是没有被自动调用,应该时你自己使用该方法时调用 参考技术D 显示时被paint方法调用。
paint方法会调用paintComponent,paintBorder,paintChildren等方法。

如何根据我的paintComponent中的if条件在我的Java GUI中绘制文本?

【中文标题】如何根据我的paintComponent中的if条件在我的Java GUI中绘制文本?【英文标题】:How do I draw text in my Java GUI based on an if condition in my paintComponent? 【发布时间】:2022-01-14 19:17:34 【问题描述】:

我有一个在我的paintComponent 中赢得游戏的if 条件,我想知道我应该如何绘制它以显示在我的Jpanel Java GUI 中?

 @Override
    public void paintComponent (Graphics g)
        Graphics2D g2 = (Graphics2D) g;
        Graphics2D buffer = world.createGraphics();
        buffer.setColor(Color.black);
        buffer.fillRect(0, 0, GameConstants.WORLD_WIDTH, GameConstants.WORLD_HEIGHT);

        this.p1.drawImage(buffer);
        this.p2.drawImage(buffer);
        this.p3.drawImage(buffer);
        this.p4.drawImage(buffer);
        this.s1.drawImage(buffer);
        this.a1.drawImage(buffer);
        this.a2.drawImage(buffer);
        this.a3.drawImage(buffer);
        this.a4.drawImage(buffer);
        //g2.drawImage(this.Background,0,0,null);
        g2.drawImage(world,0,0,null);
        if (this.p1.x == 6000 && this.p2.x == 6000 && this.p3.x == 6000 && this.p4.x == 6000)
            g2.drawString("YOU WIN!!!");
        


    

【问题讨论】:

调试你的代码,打印或检查p1-p4的值,因为它们都必须是6000 @MadProgrammer 我以前有过。 考虑提供一个minimal reproducible example,因为我基本上可以让它工作,但是你的代码有些地方不工作 【参考方案1】:

要绘制字符串,您必须指定坐标。

g.setFont();  // set a font if you wish use -- new Font(...)
if (some condition) 
    g.drawString(str, x, y);

但您似乎做错了很多事情。首先,您应该将super.paintComponent(g); 作为paintComponent 方法中的第一条语句。而且你应该只使用paintComponent 提供的图形上下文进行绘画另外请注意

    坐标必须在您正在绘制的容器的范围内,并且 您必须使用g.setColor() 设置颜色,其中参数来自Color 类。否则,您可能会使用与容器背景相同的默认颜色进行绘制,因此不会被看到。

您可能还想考虑使用JOptionPane 来显示中奖信息或任何其他信息。 另请查看Java Tutorials 上的绘画示例和使用JOptionPane

【讨论】:

谢谢,但我仍然没有看到任何显示。 你在画什么。坐标必须在你画的范围内。您还必须使用 g.setColor() 设置颜色,其中参数来自 Color 类。否则你可能用相同的颜色绘画,所以它不会被看到。很抱歉我忘了提。 现在可以使用了 :) “我忘了说。” 看来成功了。您可以将edit 加入到答案中以提高知名度吗? OP:请点击左侧的“打勾”接受答案。 @AndrewThompson 完成! (我应该在没有刺激的情况下这样做。)我也把解释解释得更清楚了。谢谢!

以上是关于java中的paintComponent啥时候被调用的主要内容,如果未能解决你的问题,请参考以下文章

如何根据我的paintComponent中的if条件在我的Java GUI中绘制文本?

为啥我在 paintComponent 中的 gif 动画不起作用?

c语言中的RETURN()返回值是啥意思?

paintComponent 方法不起作用 - Java

JAVA、GUI JPanel、JFrame、paintComponent、图形

Java - 方法 repaint() 不调用 paintComponent() 方法