我正在實施一個版本的紙牌遊戲集。我有一個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
方法在這個循環之後行爲如此奇怪?
任何想法爲什麼它沒有這個額外的代碼之前for循環? – mike
@mike,不,我不明白你對問題的口頭描述,你發佈的代碼是不可執行的,我沒有時間仔細查看代碼。我只是給你正確的方式來編寫你的應用程序。 – camickr
這有效,對不起,如果我不清楚。基本上在循環之前,面板沒有'panel.revalidate()'和'panel.repaint()'正確更新。循環執行後,這兩行變得絕對必要。 – mike