使用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);
}
}
}
};
这是一个黑色杰克游戏,有4名玩家经销商。
repaint()
由4个函数调用:
初始绘制的构造函数。
一种更新方法,用于创建要为初始交易打印的ArrayList
个对象。
另一种更新方法,为每张绘制的卡片创建ArrayList
。
并重置清除所有ArrayLists
并重新绘制新的初始交易。
我不会进入后端,但这四种方法中的每一种都只运行了所需的次数。每次被召唤一次。
我的问题是,当paintComponent
调用repaint()
时,paintComponent()
会运行近200次,不包括平均每次运行10次的for
个循环每场比赛。
我的问题是:
1)这是paintComponent
方法的常见行为吗? paintComponent一遍又一遍地重复调用自己,直到完成所有必要的绘画?
OR
2)这与JPanel tableBottom
有关吗?在这一点上,没有任何东西实际上被添加到JPanel,因为它是最顶级的JPanel。但是,对于每个JPanel,JFrame,ContentPane,Label等,可能会重复运行paintComponent
,
OR
3)我在下面的代码中做错了什么?再次通过使用增量和打印语句进行测试,我发现更新方法被称为适当的次数并正确地完成其工作。
感谢您的帮助。
答案 0 :(得分:3)
是一个内部类,我调用像tableBottom.paintComponent()
这样的重绘
永远不要直接调用paintComponent()方法。要重新绘制面板,请执行以下操作:
tableBottom.repaint();
请求将传递给RepaintManager,然后RepaintManager将对所有组件组合repaint()请求,然后根据需要绘制组件。这将使绘画更有效率。
g.drawImage(temp1.getImage(), temp1.getX(), temp1.getY(), this);
" this"意味着图像可以在阅读时重新绘制。有时,在图像I / O完成之前调用绘制方法。因此,在这种情况下,当I / O完成时,将进行另一个绘制请求,以便完全绘制图像。如果您在课程开始时阅读图像并将它们存储在某些数据结构中,那么您可以使用" null"而不是"这"。
我在下面的代码中做错了什么?
代码提供看起来合理,但我们无法查看调用绘制代码的方式/时间。我已经提到了一个问题。
发布展示问题的正确SSCCE。