2011-03-05 159 views
3

我有下面的代码。为什么此打印行命令执行两次?

这一切正常,但恼人的是,while循环中的打印行命令运行两次。有(我已经测试过),只有队列中的唯一项目,没有重复。

public void paint(Graphics g) { 

    boolean isParent; 

    int drawCount = 1; 

    int x = 0, y = 0, width = 0, height = 0; 
    Color colour; 

    while (!qtreeQueue.empty()) { 

     drawNode = (QuadTreeNode) qtreeQueue.deque(); 
     isParent = drawNode.getIsParent(); 

     if (!isParent) { 
      x = drawNode.getRectangle().x; 
      y = drawNode.getRectangle().y; 
      width = drawNode.getRectangle().width; 
      height = drawNode.getRectangle().height; 
      colour = getRectangleColour(drawNode); 
      System.out.println(drawCount + ". Drawing: x = " + x + "; y = " + y + 
        "; width = " + width + "; height = " + height + 
        "; colour = " + colour.toString()); 
      minMax(drawNode); 
      g.setColor(colour); 
      g.fillRect(x, y, width, height); 
      drawCount++; 
     } 
    } 
    System.out.println("Minimum level of tree: " + min + "\nMaximum level: " + max); 
} 

感谢帮助。

+0

qtreeQueue从哪个类?它是你自己的课程之一吗?我想到的唯一两件事情是它的'empty()'方法有问题,或者'paint'连续快速调用两次。后者可能是这种情况,如果队列总是在油漆前填满。 – 2011-03-05 15:13:46

+0

是的,我没有看到paint()被调用两次,但我想它一定是。 – Alex 2011-03-05 15:15:50

+0

任何事件都会触发'repaint()',这是我所知道的。 – Alex 2011-03-05 15:17:37

回答

6

这意味着paint方法被调用两次,这是非常正常的。系统可以根据需要多次调用paint,因此您不应该执行任何可能会在该方法中更改程序状态的操作。

+0

你会如何建议我打印出来的信息? – Alex 2011-03-05 15:13:42

+0

@AlexW:'paint'意味着*只*刷新屏幕的内容。您应该使用单独的方法执行所有更新和其他操作('deque','println'等),并在实际数据发生变化时调用它。无论何时需要重新绘制屏幕的一部分,系统都可以调用“绘画”,例如。如果窗口最大化或移动。 – casablanca 2011-03-05 15:16:54

+0

但是如果我从paint调用一个方法来做到这一点,它会做两次吗?顺便说一下,这只发生在深度首次搜索。广度优先不重复。 – Alex 2011-03-05 15:26:58