我在使用paintComponent()和repaint()时遇到了一个奇怪的问题。
如下所示,我有一个 paintComponent()
类作为内部类,作为 GUI 的主 JPanel。
// add another panel to centerInner
tableBottom = new JPanel() {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (!paintImages.isEmpty()) {
for (PaintImages temp : paintImages) {
g.drawImage(temp.getImage(), temp.getX(), temp.getY(), this);
}
}
if (!extraCards.isEmpty()) {
for (PaintImages temp1 : extraCards) {
g.drawImage(temp1.getImage(), temp1.getX(), temp1.getY(), this);
}
}
}
};
这是一款黑 jack 游戏,有 4 名玩家和庄家。
repaint()
由 4 个函数调用:
初始绘制的构造函数。
一种更新方法,用于创建对象的 ArrayList
来打印初始交易。
另一种更新方法为每张抽出的卡片创建一个 ArrayList。
重置会清除所有 ArrayList 并重新绘制新的初始交易。
我不会进入后端,但这四种方法中的每一种都只运行所需的次数。每次调用时只需一次。
我的问题是,当 repaint()
调用 paintComponent
时,paintComponent()
运行了近 200 次,不包括 >for
循环每场游戏平均运行 10 次左右。
我的问题是:
1) 这是 paintComponent
方法的常见行为吗? PaintComponent 是否会一遍又一遍地重复调用自身,直到完成所有必要的绘制?
或者
2) 这与 JPanel tableBottom
有关吗?此时,实际上没有任何内容被添加到 JPanel,因为它是最顶层的 JPanel。但也许 paintComponent
会针对每个 JPanel、JFrame、ContentPane、Label 等重复运行,
或者
3)我在下面的代码中做错了什么吗?再次通过使用增量和打印语句进行测试,我发现更新方法被调用了适当的次数并且正确地完成了它们的工作。
感谢您的帮助。
最佳答案
being a inner class I call repaint like tableBottom.paintComponent()
切勿直接调用paintComponent()方法。要重新绘制面板,您需要执行以下操作:
tableBottom.repaint();
请求将被传递到 RepaintManager,然后 RepaintManager 将组合所有组件的 repaint() 请求,然后根据需要绘制组件。这将使绘画更加高效。
g.drawImage(temp1.getImage(), temp1.getX(), temp1.getY(), this);
“this”意味着图像可以在读取时重新绘制。有时,绘制方法会在图像 I/O 完成之前被调用。因此,在这种情况下,当 I/O 完成时,将发出另一个绘制请求,以便完整绘制图像。如果您在类(class)开始时读取图像并将它们存储在某种数据结构中,那么您可能可以只使用“null”而不是“this”。
Did I do something wrong in my code below?
提供的代码看起来很合理,但我们看不到如何/何时调用绘画代码的上下文。我已经提到过一个问题。
发布正确的SSCCE这说明了问题。
关于java - PaintComponent() 被调用 200 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33506094/