Java Swingでボードを再描画

jdk94:

私はゲームを実装しようとしています。これは、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);

配列は、新しい空のあり、パネル内のオブジェクトは全く変更されていません。そして、あなたは新しい空の背景色を設定し、それがどこにも表示されません。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=339167&siteId=1