gpt4 book ai didi

java - 仅在 Java Swing 重绘后触发事件?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:13:59 24 4
gpt4 key购买 nike

我正在用 Java 制作一个简单的棋盘游戏,我想在其中制作掷骰子的动画。所以我闪现像这样的骰子图片:

public Timer roll_dice = new Timer(50, this);
...
public void actionPerformed(ActionEvent evt) {
if(roll_dice.getDelay() > 500){
roll_dice.setDelay(50);
roll_dice.stop();
movePiece();
}else{
roll_dice.setDelay(roll_dice.getDelay() + 50);
dice_panel.repaint(0);
}
}
}

movePiece(){
//do some more painting
}

所以骰子会显示随机数几次,然后慢慢确定一个数字。完成后,我想调用 movePiece() 方法。然而,事实上,重绘偶尔会发生并搞砸一切,以便在骰子滚动实际完成动画之前调用 movePiece()

有没有人知道我如何才能在最终重绘发生后才调用 movePiece?

最佳答案

So the die is going so show random numbers for a few times, and then slowly settle on a number. After that is done I would like to call the movePiece() method. However, as it is, the the repaint occurs sporadically and screws everything up so that movePiece() gets called before the dice roll is actually finished animating.

这里让我担心的是为什么您的绘画会偶尔发生 - 它根本不应该那样做,也许是您需要解决的问题。我想知道您是否在每次绘图时都从文件中读取图像,或者是其他原因导致绘图速度变慢。如果您在这个问题上需要更多帮助,那么您必须向我们提供有关您如何绘画的更多信息。无论如何,您应该避免让程序逻辑依赖于绘制,因为您无法完全控制何时甚至是否进行绘制。

与其重新绘制图像并调用 repaint(),不如在程序启动时简单地将掷骰子图像放入 ImageIcons,然后在 Swing Timer 中,交换 JLabel 中的图标?然后当延迟足够长时停止你的计时器,并在那个 if block 中移动你的棋子。

因此,假设您有多个骰子,每个骰子都可以由一个 JLabel 显示,该 JLabel 保存在一个名为 diceLabels 的 JLabel 数组中,而 ImageIcons 可以保存在一个名为 diceIcons 的数组中。然后你可以这样做:

  public void actionPerformed(ActionEvent e) {
if (roll_dice.getDelay() > 500) {
roll_dice.setDelay(50);
roll_dice.stop();
movePiece(); // I like this -- this shouldn't change
} else {
roll_dice.setDelay(roll_dice.getDelay() + 50);
// dice_panel.repaint(0);
for (JLabel dieLabel : diceLabels) {
int randomIndex = random.nextInt(diceIcons.length);
dieLabel.setIcon(diceIcons[randomIndex]);
}
}
}

我喜欢您调用 movePiece() 时的逻辑,我认为这应该保持不变。

关于java - 仅在 Java Swing 重绘后触发事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9807718/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com