paintComponent方法运行三次

时间:2014-04-15 02:14:28

标签: java swing graphics paintcomponent

有点奇怪的问题。

我有一个" Circles"的ArrayList我已经在我的绘图面板中绘制了但是在它们被绘制之前,它们通过一种方法进行验证,该方法检查它们是否在面板内,这意味着在面板的范围内100。传递此数据的圈数"得出()"方法由我的circleDrawn整数变量计数,然后在方法稍后在控制台中打印。

我在paintComponent方法中打印数据是为了正确同步,因为我在我的驱动程序main方法中遇到了问题。但是,当我的程序运行时,这个数据打印三次,circleDrawn变量的第二次和第三次分别是值的两倍和三倍。

有没有办法防止这种情况发生或有任何有用的指示,任何人都可以给我如何纠正这个?

我只附加了paintComponent方法,以避免将整个项目转储到这里,但如果需要更多上下文,我可以轻松提供它。

@Override
protected void paintComponent(Graphics g) 
{
    super.paintComponent(g);

    for (int i = 0; i < circles.size(); ++i)
    {
        if (circles.get(i).drawn(DEFAULT_WIDTH, DEFAULT_HEIGHT) == true)
        {
            circles.get(i).draw(g);

            circlesDrawn++;
        }
    }

    System.out.println("Number of circles drawn: " + circlesDrawn);
}

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:5)

  

有没有办法防止这种情况发生?

不,而且你不想尝试这样做。意识到您无法完全控制何时甚至 如果调用 绘制方法 - 例如,如果重叠请求被堆叠,可能不会全部被调用,并且无论您的代码如何,JVM有时会根据操作系统的要求启动绘画。因此,您应该确保您的代码不依赖于此控件。关于您可以做的最好的事情是通过传入适当的参数来限制进行repaint(...)调用时重新绘制的区域。

有关详情,请参阅Painting in AWT and Swing


请注意,这部分问题让我感到困惑:

  

我在paintComponent方法中打印数据是为了正确同步,因为我在我的驱动程序主方法中遇到了问题。

你能详细说明一下吗?如果您的代码遵循Swing线程规则,那么这不应该是一个问题。