repaint为什么执行了两次?

sbaiss 2011-01-12 09:16:33

int i; //记录重绘次数
public void display(Shape shape,Ground ground){
System.out.println("GamePanel's display begin");
this.shape = shape;
this.ground = ground;
repaint();
System.out.println("GamePanel's display end");
}
@Override
protected void paintComponent(Graphics g) {
// TODO Auto-generated method stub

if(shape !=null && ground != null){

System.out.println(i++);
shape.drawMe(); //此方法会打印Shape's drawMe
ground.drawMe(); //此方法会打印Ground's drawMe
}
}


打印结果:
GamePanel's display begin //第一次调用display
GamePanel's display begin
0
Shape's drawMe
Ground's drawMe
1
Shape's drawMe
Ground's drawMe
GamePanel's display begin //第二次调用display
GamePanel's display end
2
Shape's drawMe
Ground's drawMe
GamePanel's display begin //第三次调用display
GamePanel's display end
3
Shape's drawMe
Ground's drawMe

display()是由其它类不停调用的,从打印结果里能看出,display里的repaint第一次调用的时候连续重绘了两次,以后就正常了,这是为什么呢??
...全文
177 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
为这个问题苦恼了一晚啊。
这个是俄罗斯方块吧。。嘿嘿。
sbaiss 2011-01-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sunyiz 的回复:]
正如2楼说的,Swing会在很多时候,自动repaint的
楼主这里的现象是由于在componentShown事件时,
自动repaint引起的
看源码中的两段吧:


Java code
public void componentShown(ComponentEvent e) {
if (shouldShow()) {
……
[/Quote]

谢谢了 呵呵
1232131231 2011-01-13
  • 打赏
  • 举报
回复
只要窗体显示、布局、位置稍有改变都会触发...
sunyiz 2011-01-13
  • 打赏
  • 举报
回复
正如2楼说的,Swing会在很多时候,自动repaint的
楼主这里的现象是由于在componentShown事件时,
自动repaint引起的
看源码中的两段吧:

        public void componentShown(ComponentEvent e) {
if (shouldShow()) {
synchronized (getTreeLock()) {
if (peer != null) {
peer.show();
}
}
}
}


    public void show() {
if (!visible) {
synchronized (getTreeLock()) {
visible = true;
mixOnShowing();
ComponentPeer peer = this.peer;
if (peer != null) {
peer.show();
createHierarchyEvents(HierarchyEvent.HIERARCHY_CHANGED,
this, parent,
HierarchyEvent.SHOWING_CHANGED,
Toolkit.enabledOnToolkit(AWTEvent.HIERARCHY_EVENT_MASK));
if (peer instanceof LightweightPeer) {
repaint();
}
updateCursorImmediately();
}

if (componentListener != null ||
(eventMask & AWTEvent.COMPONENT_EVENT_MASK) != 0 ||
Toolkit.enabledOnToolkit(AWTEvent.COMPONENT_EVENT_MASK)) {
ComponentEvent e = new ComponentEvent(this,
ComponentEvent.COMPONENT_SHOWN);
Toolkit.getEventQueue().postEvent(e);
}
}
Container parent = this.parent;
if (parent != null) {
parent.invalidate();
}
}
}
lijiananshen 2011-01-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 tang_123_ 的回复:]

代码放全一点看看
[/Quote]
每天回复有积分
magong 2011-01-12
  • 打赏
  • 举报
回复
这个正常,因为paintComponent方法不光可被repaint触发,其他如初次布局、resize、窗口移动等因素都会触发paintComponent方法执行。
tang_123_ 2011-01-12
  • 打赏
  • 举报
回复
代码放全一点看看

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧