我正在实施一款卡牌游戏Set。我有一个名为JPanel
的{{1}}对象,它会显示所有卡以及相应的侦听器。
CardPanel
GraphicCard对象只是Set中定义的Card和JLabel的一个关节,它包含该卡的图像。当我最初填充甲板时,一切正常。显示所有卡片。
当提交Set时,游戏是多人游戏,因此客户端将必要的信息发送到服务器,然后服务器将该更新广播给所有客户端。运行的更新方法如下:
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...
}
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
的{{1}}。现在这里是奇怪的部分。你看到ArrayList
,然后我在下一行添加一些东西,这很好用(显然它不是我想要的功能)。我提交了一套,它通过服务器,现在所有的主板都只有来自GraphicCard
的第一张卡。如果我删除该行并运行后面的cardPanel.removeAll()
循环,则cardSet
方法都不再有效。如果我在for循环后调用for
没有任何反应,如果我尝试添加,则没有任何反应,至少在视觉上没有。我在for循环中遗漏了什么导致cardPanel
方法的行为在此循环后表现得如此奇怪?
答案 0 :(得分:0)
从可见GUI添加(或删除)组件时,基本代码为:
panel.add(...);
panel.revalidate();
panel.repaint();
revalidate()调用布局管理器,repaint()确保组件以适当的大小/位置绘制。