2015-11-03 49 views
1

我在使用paintComponent()和repaint()时遇到了一个奇怪的问题。 正如你在下面看到的,我有一个paintComponent()类作为内部类作为我的GUI的主要JPanel。paintComponent()被调用了200次

// add another panel to centerInner 
    tableBottom = new JPanel() { 
     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      if (!paintImages.isEmpty()) { 
       for (PaintImages temp : paintImages) { 
        g.drawImage(temp.getImage(), temp.getX(), temp.getY(), this); 
       } 
      } 
      if (!extraCards.isEmpty()) { 
       for (PaintImages temp1 : extraCards) { 
        g.drawImage(temp1.getImage(), temp1.getX(), temp1.getY(), this); 
       } 
      } 
     } 
    }; 

这是一个黑色杰克游戏,有4个玩家的经销商。

初始拉伸的构造:

repaint()由4个功能调用。 一种更新方法,用于创建要为最初交易打印的对象ArrayList。 另一种更新方法,为绘制的每张卡创建一个ArrayList。 并重置清除所有ArrayLists并重新绘制新的初始交易。

我不会进入后端,但这四种方法中的每一种都只能运行所需的次数。只是每次召唤一次。

我的问题是,当paintComponentrepaint()调用,paintComponent()运行近200倍,不包括乱跑,平均每场比赛一张10倍for循环。

我的问题是:

1)是一个paintComponent方法这个共同的行为? PaintComponent是否会一遍又一遍地重复自己,直到所有绘画都已完成?

OR

2),这都与Jpanel tableBottom办?在这一点上,没有什么实际上被添加到JPanel,因为它是最顶级的JPanel。但也许是paintComponent反复跑了每一个的JPanel,JFrame的,contentPane中,标签等,

OR

3)难道我做错了什么在我下面的代码?再次通过使用增量和打印语句进行测试,我发现更新方法被调用适当的时间并正确地执行它们的工作。

感谢您的任何帮助。

+0

你的代码看起来不错;问题可能在其他地方。 AFAIK paintComponent每个组件被调用一次,所以它不是增量式的。也许可以使用IDE中的调试器来查看调用堆栈?可能有一个组件行为异常,从paint方法中触发重绘事件。 – Kenney

+0

每当tableBottom被调整大小或每当它获得一次曝光(如果没有backings存储)或每当它的父级重置其位置时,都会调用paintComponent()。多久刷新一次被调用? (只要覆盖它,并让它调用super.repaint())? – FredK

+0

@FredK在最初的抽奖中它被调用一次,之后每张抽奖一次。我删除了我以前的其他2个。 'super.repaint()'会做什么,我会把它放在哪里?因为'paintComponent'是一个内部类,所以我调用了像'tableBottom.paintComponent() –

回答

3

是一个内部类我打电话重绘像tableBottom.paintComponent()

决不直接调用的paintComponent()方法。重新喷涂面板,您做:

tableBottom.repaint(); 

的请求将被传递到的RepaintManager然后将结合重绘()请求所有的组件,然后再粉刷成分是必要的。这将使绘画更有效率。

g.drawImage(temp1.getImage(), temp1.getX(), temp1.getY(), this); 

“这”意味着图像可以在读取时重新绘制。有时在图像I/O完成之前调用绘画方法。因此,在这种情况下,当I/O完成时,将进行另一个绘画请求,以便完全绘制图像。如果您在课程开始时阅读图像并将它们存储在某个数据结构中,那么您可能只需使用“null”而不是“this”。

我在下面的代码中做错了什么?

代码提供看起来合理,但我们不能看到如何/当您调用绘画代码的上下文。我已经提到过一个问题。

发布适当的SSCCE,证明存在问题。