有点奇怪的问题。
我有一个" 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);
}
提前感谢您的帮助。
答案 0 :(得分:5)
有没有办法防止这种情况发生?
不,而且你不想尝试这样做。意识到您无法完全控制何时甚至 如果调用 绘制方法 - 例如,如果重叠请求被堆叠,可能不会全部被调用,并且无论您的代码如何,JVM有时会根据操作系统的要求启动绘画。因此,您应该确保您的代码不依赖于此控件。关于您可以做的最好的事情是通过传入适当的参数来限制进行repaint(...)
调用时重新绘制的区域。
有关详情,请参阅Painting in AWT and Swing
请注意,这部分问题让我感到困惑:
我在paintComponent方法中打印数据是为了正确同步,因为我在我的驱动程序主方法中遇到了问题。
你能详细说明一下吗?如果您的代码遵循Swing线程规则,那么这不应该是一个问题。