在您致电repaint()
之后,它不会立即重新绘制组件。但它添加了在EDT中的事件队列中再次绘制组件的请求。
在每行代码会发生什么情况如下expained ..
repaint(squareX,squareY,squareW+OFFSET,squareH+OFFSET);
马克由方(squareX,squareY,squareW+OFFSET,squareH+OFFSET)
围成的区域将是重新绘制。但它没有得到重新绘制,直到RepaintManager
这样做..
squareX=x;
squareY=y;
变化squareX
和squareY
值。但它不会改变早先标记的区域进行重新粉刷。现在,要重新绘制的区域也是先前的值。
repaint(squareX,squareY,squareW+OFFSET,squareH+OFFSET);
标记由方块(squareX,squareY,squareW+OFFSET,squareH+OFFSET)
包围的区域将被重新绘制。现在有两个部分RepaintManager
必须重新绘制。上一个广场和新广场。但它不会被重新粉刷,直到RepaintManager
这样做。
最后当时间到了,RepaintManager
绘制组件。
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString("This is my custom Panel!",10,20);
g.setColor(Color.RED);
g.fillRect(squareX,squareY,squareW,squareH);
g.setColor(Color.BLACK);
g.drawRect(squareX,squareY,squareW,squareH);
}
现在组件只绘制2个区域。 (以前的广场和新的广场)但是红色的广场只会在新的广场内画出。在老广场上没有什么可以画的。所以先前绘制的东西将被删除..
其实虽然有2个方法调用repaint()
,paintComponents()
将只被调用一次。要重新绘制的总面积由RepaintManager
和paintComponents()
处理仅处理一次..
请正确缩进此。否则,我无法真正阅读它。 –
'repaint'不会立即发生,它们被发布到事件队列中并在将来的某个时刻处理,因为'moveSquare'方法在EDT中执行,您可以保证重绘不会直到'moveSquare'方法退出之后才会发生 – MadProgrammer