2012-05-08 22 views
3

ボタンのイメージアイコンを更新する方法を知っていますか?ボタンを更新する方法Javaの画像アイコン

問題がある:私はチェッカーのゲームを作って、GUIを作成してい

。移動をした後に私がAIに電話したことを除いて、AIを含めてすべてが動作し、結果としてボタンにチェッカーが表示されません。

  1. チェッカーはすぐに行動を起こすためにAIを呼び出し
  2. を行かなければならない次のスポットにチェッカー
  3. クリックがある特定のボタン上のボタン
  4. クリックをクリックしました。

私のボタンにはチェッカーの画像のアイコンがあります。チェッカーが必要な次の場所をクリックするとJPanelのJButtonはその瞬間に更新されませんが、AIが移動してそれは私のチェッカーがどこに行ったかわからないという結果に終わる。

3-4が逐次的に呼び出されるとき、AIが行った移動だけが表示されますが、私は動作しません。なぜなら、すべてが実装のactionListenerを終了した後にリフレッシュするからです。

私は電話してみました: repaint(); revalidate(); invalidate(); ボタンを含む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文の後)

会は基本的に、私はX Yは、ユーザーの選択ボタン、及びユーザの先のボタンの座標を算出するの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);    
    }   
} 

上に配置される8×8ボタンのアレイです。彼が正しい動きをしているかどうかを確認するいくつかがありますが、これは主要な動きの部分です。

XのY座標の差が1の場合、プレイヤーがジャンプしていないことを意味します.XのY座標の差が2の場合、プレイヤーがジャンプしています。元のX座標のボタンをnullに設定する必要があります。アイコンが消えたことを意味し、新しいimageIconを移動先のX座標に置きます。

プレイヤーがジャンプしている場合は、ユーザーがピースを食べる場所を計算し、そのimageIconもnullに設定する必要があります。

AIは、最良の移動を計算するために再帰関数を使用してAIがX座標を計算することを除いて全く同じことを行います。

主な問題は、プレーヤープレイヤーがAIを計算して再生し、処理後に両方の結果が一緒に表示されることです。 AIが計算して再生する前にイメージアイコンを再描画させることは可能ですか?AIは

+0

で試してみてください。おそらくユーザの移動が読み込まれ、その後AIのターンが開始されるコードです。 – David

+0

Hmm。あなたのコードの外見から、AIは動くべきではありません! '' AI ".equals(" enabled ")'は決して真ではないので、 'AIMoves(board、" Red ");はここから決して呼び出されません。あなたは 'AIMoves(board、" Red ");が呼ばれていると確信していますか? – David

+0

申し訳ありません、私は大幅にコードを減らしています。プレイヤーが合法的な動きをしているかどうかをテストする必要があるため、プレイヤーの数百人ほどです。 – user1157751

答えて

1

を果たしたものを、そのようプレイヤーは、彼が果たしたかを見ることができます、とすると、あなたは誰があなたを助けることができる前に、いくつかのコードを表示する必要があるとしているboard[save_x][save_y].repaint();

関連する問題