运行代码片段后,JPanel方法停止工作

时间:2014-05-06 15:20:01

标签: java swing

我正在实施一款卡牌游戏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方法的行为在此循环后表现得如此奇怪?

1 个答案:

答案 0 :(得分:0)

从可见GUI添加(或删除)组件时,基本代码为:

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

revalidate()调用布局管理器,repaint()确保组件以适当的大小/位置绘制。