jframe的repaint有时不起作用?

发布于 2022-09-06 15:10:24 字数 3055 浏览 23 评论 0

正在尝试用java/swing自己做一个“拖拉机”的带GUI游戏 。
详细的规则可见WP上的介绍:https://en.wikipedia.org/wiki...。但是这个问题和游戏规则并无太大关系。

大致思路:一轮游戏结算完成之后,清空台上所有的图像,然后进行新一轮的游戏。
第一轮发牌时,所有玩家的牌都能随着发牌正常地递增显示。
但是第二轮时,尽管newRound()开头调用了frame.repaint(),但是发牌过程中图像一直停留在上一轮抄底时的状态。直到deal()的结尾,所有玩家的卡牌终于能再次显示。
display()看起来并无问题,就是把image加到frame里,第一轮的发牌以及所有的出牌过程都是正常的。

百思不得解,为什么第二轮之后要到deal()的结尾图像才会刷新呢?如果是因为repaint的原因,newRound开头也调用过了啊。

SF上貌似不能上传附件。完整的源码在gitee上,不知道是否能贴个链接。

请无视deposit()函数,其作用仅仅是改变了某个enum变量的值。

以下是代码片段

 public void newRound() {
    roundNumber++;
    log.info("Round " + roundNumber + " starts");
    deposits.clear();
    frame.repaint();
    if (roundNumber <= 1) {
        boolean bid = false;
        do {
            initDeck();
            for (Player p: this.toPlayerArray()) {
                p.dropAll();
            }
            bid = this.deal();
        }
        while (!bid);
    }
    else {
        log.info("All players now clearing card image");
        for (Player player: this.toPlayerArray()) {
            player.clearImage();
        }
        bidInfo.reset();
        frame.repaint();
        Pauser.pause(4000);
        initDeck();
        deal();
    }
    deposit();
}

public boolean deal()  {
    // Determine who is the first to draw
    phase = Phase.Dealing;
    if (roundNumber <= 1) {
        Player[] players = this.toPlayerArray();
        int index = rand.nextInt(players.length);
        dealer = players[index];
        log.info("First round. Randomly decide a tmp dealer: " + dealer.role);
    }

    south.displayBidder();
    current = dealer;
    for (int i = 0; i < Card.NUM_OF_CARD_PLAYER; i++) {
        do {
            current.drawFromDeckStaic(deck);
            if (roundNumber > 1) {
                log.info(current.role.name() + " now has " + current.getHand().size() + " cards");
            }
            // Todo: below should be configurable
            current = this.shift();
        }
        while (current != dealer);
        Pauser.pause(250);
        this.display();
    }

    log.info("Dealing done. Waiting for bidding");
    Pauser.pause(5000);
    if (bidInfo.suit == CardSuit.NONE) {
        log.info("No one bids");
        if (roundNumber <= 1) {
            log.info("Dealer not decided. Restart game");
            return false;
        }
        else {
            // Todo: behavior should be configurable
            bidInfo.suit = CardSuit.NO_TRUNMP;
            log.info("Use no-trump");
        }
    }

    if (roundNumber <= 1) {
        dealer = bidInfo.bidder;
        log.info("First round. Dealer set to " + dealer.role.name());
    }
    else {
        log.info("Subsequent round");
    }

    south.hideBidder();
    Pauser.pause(3000);

    dealer.drawAllFromDeck(deck);
    dealer.displayCard();
    frame.repaint();
    return true;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文