2014-05-06 87 views
0

我正在實施一個版本的紙牌遊戲集。我有一個JPanel對象CardPanel,它顯示所有卡片以及適當的聽衆。JPanel方法在代碼片段運行後停止工作

public class CardPanel extends JPanel implements MouseListener { 
    public CardPanel() { 
     setLayout(gridLayout); 

     placeCards(N); 
     chatBoxText = new JTextArea(5, 30); 
    } 

    public void placeCards(int numCards) { 
     for (int i = 0; i < numCards; i++) { 
      Card card = deck.distributeCard(); 
      String cardImageName = card.getImageName(); 

      JLabel jLabel = makeImage(cardImageName); 
      cardSet.add(new GraphicCard(card, jLabel)); 

      add(jLabel); 
      jLabel.addMouseListener(this); 
     } 

     if (GameLogic.noSetsOnBoard(cardSet)) { 
      gridLayout.setRows(gridLayout.getRows() + 1); 
      placeCards(3); 
     } 
    } 

    public void updateCard(Integer location) { 
     Card card = deck.distributeCard(); 
     String cardImageName = card.getImageName(); 

     JLabel jLabel = makeImage(cardImageName); 
     cardSet.set(location, new GraphicCard(card, jLabel)); 

     jLabel.addMouseListener(this); 
    } 

    public void mouseListener... 
} 

GraphicCard對象只是Set中定義的Card和包含該卡圖像的JLabel的聯合。當我最初填充甲板時,一切正常。顯示所有卡片。

當提交一個集合時,遊戲是多人遊戲,所以客戶端將必要的信息發送到服務器,然後將該更新廣播給所有客戶端。時運行的更新方法如下:

public void correctSetUpdate(ArrayList<Integer> submittedTriplet, Player player) { 
    boolean removeRow = true; 

    cardPanel.removeAll(); 
    cardPanel.add(cardSet.get(0).getJLabel()); 

    for (int cardLocation : submittedTriplet) { 
     if (cardSet.size() > N) { 
      cardSet.remove(cardLocation); 
      if (removeRow) { 
       gridLayout.setRows(gridLayout.getRows() - 1); 
       removeRow = false; 
      } 
     } else { 
      if (deck.deckSize() != 0) { 
       cardPanel.updateCard(cardLocation); 
      } 
     } 
    } 

    for (GraphicCard card: cardSet) { 
     cardPanel.add(card.getJLabel()); 
    } 
} 

cardSet對象是所有GraphicCard目前在板的一個ArrayList。這裏是怪異的部分。你看到cardPanel.removeAll(),然後我在下一行添加一些東西,這很好(顯然它不是我想要的功能)。我提交了一套,它通過服務器,現在所有的板都只有cardSet的第一張卡。如果我刪除該行並運行for循環,則cardPanel方法都不再起作用。如果我在for循環之後調用removeAll()什麼都沒有發生,並且如果我嘗試添加,則不會發生任何事情,至少在視覺上不會。我在這個循環中丟失了什麼,導致cardPanel方法在這個循環之後行爲如此奇怪?

回答

0

當你從一個可見的GUI添加(或刪除)組件的基本代碼是:

panel.add(...); 
panel.revalidate(); 
panel.repaint(); 

的重新驗證()調用佈局管理器和重繪()確保組件在其適當的畫大小/位置。

+0

任何想法爲什麼它沒有這個額外的代碼之前for循環? – mike

+0

@mike,不,我不明白你對問題的口頭描述,你發佈的代碼是不可執行的,我沒有時間仔細查看代碼。我只是給你正確的方式來編寫你的應用程序。 – camickr

+0

這有效,對不起,如果我不清楚。基本上在循環之前,面板沒有'panel.revalidate()'和'panel.repaint()'正確更新。循環執行後,這兩行變得絕對必要。 – mike