私はゲームを実装しようとしています。これは、9 9により、ボード上の場所を取り、壁や1つのポーンと空のブロックが含まれています。これらの両方は、ゲームオブジェクトのサブクラスです。ゲームオブジェクトは、JLabelのを拡張します。Iは、配列内の位置を格納します。
GameObject[][] board = {
{null,null,null,null,null,null,null,null,null},
{null,null,null,null,null,null,null,null,null},
{null,null,null,null,null,null,null,null,null},
{null,null,null,null,null,null,null,null,null},
{null,null,null,null,null,null,null,null,null},
{null,null,null,null,null,null,null,null,null},
{null,null,null,null,null,null,null,null,null},
{null,null,null,null,null,null,null,null,null},
{null,null,null,null,null,null,null,null,null},
};
ゲームオブジェクトがStringからそこに置かれ、そこにそれを置く必要があるの配列Iチェック内のすべての場所のため。だから、その手段は何も、(空)が壁やポーンを入れないでしまいます。ゲームオブジェクトを追加するには、私は次のコードを使用し私のJPanelに(JLabelのを拡張します):
for(int i = 0; i < 9; i++)
{
JPanel row = new JPanel(new GridLayout(1,9));
for(int j = 0; j < 9; j++)
{
GameObject col = board[i][j];
col.setHorizontalAlignment(JTextField.CENTER);
col.setFont(new Font("SansSerif",Font.BOLD,20));
col.setOpaque(true);
col.setBackground(board[i][j].getColor());
col.setBorder(BorderFactory.createLineBorder(Color.BLACK));
row.add(col);
int finalI = i;
int finalJ = j;
}
row.setBorder(BorderFactory.createLineBorder(Color.BLACK));
panel.add(row);
}
ユーザーが移動を要求したら、ポーンは、ボード上の別の場所に配置されます。配列内の現在の場所が空に設定され、新しい場所をポーンに設定されているので。次に、2個の正方形が再描画することがあります。空のJLabelが描かれていなければとポーンのための新しい位置が描かれていなければ。これは、次のように行われます。
board[pawn.getRow()][pawn.getCol()] = new Empty(board); //Old place is now empty
board[pawn.getRow()][pawn.getCol()].setBackground(Color.WHITE); //Set the old place color to white
pawn.movePawn(rowMove, colMove); //Move the pawn internally
board[pawn.getRow()][pawn.getCol()] = pawn; //Move the pawn on the board
board[pawn.getRow()][pawn.getCol()].setBackground(Color.BLUE); //Set the color to blue
私は、コードの最後のビットを呼び出すとき残念ながら何も起こりません。配列は、ポーンの変更の内部座標を変更しますありません。しかし、JPanelの中で何も起こりません。どのように私は確信している、私は移動関数を呼び出すたびに、私のJPanelのは、変更を反映するように更新されます作るのですか?
病気あなたの例を少し簡単にします。
JLabel[][] labels = new JLabel[2][2];
今のJLabelのためのスペースを持つ2次元配列があります。
JPanel panel = new JPanel(new GridLayout(2, 2));
for(int i = 0; i<labels.length; i++){
for(int j = 0; j<labels[i].length; j++){
labels[i][j] = new JLabel(i + ", " + j);
panel.add(labels[i][j]);
}
}
今、私はのJLabelで配列を埋めてきたし、パネルにそれらの同じのJLabelを追加しました。
labels[0][0].setText("XXX");
つまり、変更内容が画面に反映されますので、私は、私のJPanelに追加することもJLabelのある、XXXのテキストを持っている私の配列内のJLabelを変更します。
labels[0][1] = new JLabel("XXX");
それが変化し、アレイ新しいJLabelのを指すようにし、それはJPanelのであるJLabelのには影響を与えません。あなたは、画面には何の変更が表示されません。
だから、何を行っています。
board[pawn.getRow()][pawn.getCol()] = new Empty(board);
board[pawn.getRow()][pawn.getCol()].setBackground(Color.WHITE);
配列は、新しい空のあり、パネル内のオブジェクトは全く変更されていません。そして、あなたは新しい空の背景色を設定し、それがどこにも表示されません。