如何刷新Java的图像图标按钮

时间:2012-05-08 04:28:58

标签: java swing

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

问题是:

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

  1. 点击按钮
  2. 点击有检查程序的特定按钮
  3. 点击检查者必须去的下一个地点
  4. 立即致电AI进行移动。
  5. 我的按钮有ImageIcons的跳棋图片,当我点击检查器需要去的下一个地方时,JPanel上的JButton在那一刻不刷新,但等到AI移动并完成它的移动结果我没看到我的检查员去了哪里。

    当3-4一个接一个地调用时,我只看到AI所做的移动,但不是我的,因为在它退出implements actionListener之后所有内容都会刷新。

    我试着打电话:         重绘();         重新验证();         无效(); 在包含按钮的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
         }
    }
    

    人工智能在同一回合播放,但人工智能计算大约需要1分钟,此时,玩家的动作在AI播放前不可见,因为它在停止动作后更新了所有按钮。其他声明)。

    Board是一个8x8按钮的数组,放在JPanel

    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);            
        }        
    }
    

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

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

    如果玩家正在跳跃,那么我还需要计算用户吃掉该棋子的地方,并将该imageIcon设置为空。

    AI完全相同,只是AI通过使用递归函数计算最佳移动来计算X Y坐标。

    主要问题是玩家玩家,然后AI计算和播放,然后在过程之后,它将显示两者的结果。在AI计算和播放之前,是否可以让它重绘图像图标?这样玩家就可以看到他演奏的内容,然后是AI播放的内容

1 个答案:

答案 0 :(得分:2)

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