4

有人知道如何刷新按钮图像图标吗?

问题是:

我正在制作一个跳棋游戏,并创建一个 GUI。一切正常,包括 AI,除了我在移动后调用了我的 AI,导致按钮上似乎没有检查器。

  1. 点击按钮
  2. 单击有检查器的特定按钮
  3. 单击检查器必须去的下一个位置
  4. 立即呼叫 AI 采取行动。

我的按钮有棋子图片的 ImageIcons,当我点击下一个棋子需要去的地方时,JPanel 上的 JButton 不会在那一刻刷新,而是等到 AI 进行移动并完成它的移动,导致我看不到我的检查器去了哪里。

当 3-4 一个接一个调用时,我只看到 AI 所做的最终移动,但看不到我的,因为在它退出实现 actionListener 后一切都会刷新。

我试着打电话:repaint(); 重新验证();无效();在包含按钮的 JPanel 上。

在第 4 步之前,用户可以看到他/她在 AI 移动之前放置了什么。

else
{
     //This is where the code starts
     if ("White".equals(Red_Or_White.getText()))
     {
          //Meaning that it is white's turn, then
          playerPlaysAMove(x, y, goingToGo_x, goingToGo_y);
     }
     if ("AI".equals(AI_Enabled.getText()))
     {
          //AI is enabled
          AIMoves(board, "Red");
          //the AI needs to play the position as if the AI was a red player, 
          //because the player must be white
     }
}

两个AI在同一回合玩,但是AI计算大约需要1分钟,此时玩家的动作直到AI播放才可见,因为它在退出actionListener后更新所有按钮(在else语句之后) .

Board 是放置在 JPanel 上的一组 8x8 按钮

static void playerPlaysAMove(int save_x, int save_y, int moveTo_x, int moveTo_y)
{
    if(save_x - moveTo_x == 1 || save_x - moveTo_x == -1)
    {
        board[moveTo_x][moveTo_y].setIcon(board[save_x][save_y].getIcon());
        board[save_x][save_y].setIcon(null);
    }
    else if (save_x - moveTo_x == 2 && save_y - moveTo_y == 2)
    {
        board[save_x-1][save_y-1].setIcon(null);
        board[moveTo_x][moveTo_y].setIcon(board[save_x][save_y].getIcon());
        board[save_x][save_y].setIcon(null);
    }
    else if (save_x - moveTo_x == 2 && save_y - moveTo_y == -2)
    {
        board[save_x-1][save_y+1].setIcon(null);
        board[moveTo_x][moveTo_y].setIcon(board[save_x][save_y].getIcon());
        board[save_x][save_y].setIcon(null);            
    }
    else if (save_x - moveTo_x == -2 && save_y - moveTo_y == 2)
    {
        board[save_x+1][save_y-1].setIcon(null);
        board[moveTo_x][moveTo_y].setIcon(board[save_x][save_y].getIcon());
        board[save_x][save_y].setIcon(null);            
    }
    else if (save_x - moveTo_x == -2 && save_y - moveTo_y == -2)
    {
        board[save_x+1][save_y+1].setIcon(null);
        board[moveTo_x][moveTo_y].setIcon(board[save_x][save_y].getIcon());
        board[save_x][save_y].setIcon(null);            
    }        
}

基本上是我计算了用户选择按钮和用户目标按钮的XY坐标。有一些检查他是否正在下正确的动作,但这是主要的动作部分。

如果 XY 坐标差为 1,则表示玩家在移动,而不是跳跃,如果 XY 坐标差为 2,则表示玩家在跳跃。我还需要将原始XY坐标的按钮设置为null,即图标消失,然后将新的imageIcon放置在目标XY坐标处。

如果玩家正在跳跃,那么我还需要计算用户吃块的位置,并将 imageIcon 也设置为 null。

AI 做的事情完全相同,只是 AI 通过使用递归函数计算 XY 坐标来计算最佳移动。

主要的问题是玩家播放,然后AI计算,然后播放,然后在处理之后,它会一起显示两者的结果。是否可以让它在 AI 计算和播放之前重绘图像图标?这样玩家就可以看到自己玩了什么,然后AI玩了什么

4

1 回答 1

2

尝试board[save_x][save_y].repaint();

于 2012-05-14T07:56:35.857 回答