jframe的repaint有时不起作用?
正在尝试用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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论