【发布时间】:2014-01-10 19:17:36
【问题描述】:
我一直在开发一个与图形相关的 java 应用程序。据我了解,每次在代码中的任何位置使用 repaint() 方法时,都会调用被覆盖的paintComponent。但是我也在paintComponent本身内部使用了repaint()。为什么它不会导致无限递归?代码运行良好。
panel = new JPanel(){
public void paintComponent(Graphics g)
{
{
panel.revalidate();
panel.repaint();
c.revalidate();
c.repaint();
revalidate();
repaint();
for(int i=0;i<linecount-1;i+=2)
{
Line2D line = new Line2D.Double(xco[i],yco[i],xco[i+1],yco[i+1]);
Graphics2D g2d = (Graphics2D) g;
if(divide[i]==1)
{
//System.out.print(xco[i]+" "+yco[i]);
//System.out.println();
g2d.setStroke(drawingStroke);
g2d.draw(line);
g2d.setStroke(simple);
}
else
{
g2d.setStroke(simple);
g2d.draw(line);
}
//g.drawLine(xco[i],yco[i],xco[i+1],yco[i+1]);
}
//g.drawLine(x1,y1,x2,y2);
panel.revalidate();
panel.repaint();
c.revalidate();
c.repaint();
revalidate();
repaint();
}
}
};
}
【问题讨论】:
-
Robin Green 是正确的:您不应该在paintComponent 中调用repaint(或revalidate)。 paintComponent 可能会被非常频繁地调用,并且需要轻量且快速。看来您无论如何都没有更改您的paintComponent 方法中的任何状态。 revalidate 调用(我很确定它会为你调用 repaint)应该立即跟随任何实际更改组件状态的代码。
-
并不是你在想它,但它会很快吞噬你的系统资源,在一两分钟内让你的系统崩溃。