2015-11-03 79 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,證明存在問題。