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 动画不起作用?