paintComponent方法运行三次

The*_*WMB 0 java graphics swing paintcomponent

有点奇怪的问题.

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

我在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);
}
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助.

Hov*_*els 5

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

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

有关更多信息,请参阅AWT和Swing中的绘画


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

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

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

  • @TheNororiousWMB:没有相关的代码,最好是[最小的,完整的,可验证的示例程序](http://stackoverflow.com/help/mcve),我认为没有人能理解你的bug或能够建议你的工作-周围. (2认同)