记住从内部到外部的国际象棋游戏的坐标

时间:2017-03-08 00:32:43

标签: java swing variables actionlistener chess

基本上,我想将ButtonListener类中actionPerformed方法中处理的所有行号的所有坐标保存到Board类中,以便移动棋子。当我运行程序时,内部类ButtonListener保存所有好的变量。但是当它们被调用到类Board中的构造函数时,变量不会保存已保存的值。我想保留从内部类到外部类的变量中的值。

编辑:提供整个班级。

public class Board extends JPanel {
Piece movingPiece;
ImageIcon image;
private int row1;
private int col1;
private int row2;
private int col2;
private JButton btn[][];
private Square squares[][];


public Board(String gameType, int row, int col) {
    setLayout(new GridLayout(8, 8));
    squares = new Square[row][col];
    btn = new JButton[row][col];
    setUpSquares();
    setUpBtns();
    setUpChessPieces();
    findPieces();
    movePiece(row1, col1, row2, col2);// all 0's

}

public void setUpSquares() {
    for (int i = 0; i < ChessGame.EIGHT; i++) {
        for (int j = 0; j < ChessGame.EIGHT; j++) {
            squares[i][j] = new Square();
        }
    }
}

public void setUpBtns() {
    for (int i = 0; i < ChessGame.EIGHT; i++) {
        for (int j = 0; j < ChessGame.EIGHT; j++) {
            btn[i][j] = new JButton();
            add(btn[i][j]);
            btn[i][j].addActionListener(new ButtonListener());
            if ((i + j) % 2 == 0) {
                btn[i][j].setBackground(Color.WHITE);
                btn[i][j].setForeground(Color.WHITE);
            } else {
                btn[i][j].setBackground(Color.DARK_GRAY);
                btn[i][j].setForeground(Color.DARK_GRAY);
            }
        }
    }
}

public void movePiece(int row1, int col1, int row2, int col2) {
    squares[row1][col1].getPiece().setRow(row2);
    squares[row1][col1].getPiece().setCol(col2);
    movingPiece = squares[row1][col1].getPiece();
    squares[row2][col2].setPiece(movingPiece);
    btn[row2][col2].setIcon(new ImageIcon(squares[row2][col2].getPiece().getPieceColor()));
}

/**
 * Finds pieces and sets the piece icons to the button.
 */
public void findPieces() {
    for (int i = 0; i < ChessGame.EIGHT; i++) {
        for (int j = 0; j < ChessGame.EIGHT; j++) {
            if (squares[i][j].getPiece() != null) {
                btn[i][j].setIcon(new ImageIcon(squares[i][j].getPiece().getPieceColor()));
            } else {
                btn[i][j].setIcon(null);
            }

        }
    }
}

public void setUpChessPieces() {
    // white pieces
    for (int i = 0; i < ChessGame.EIGHT; i++) {
        Pawn pawn1 = new Pawn(1, i, 1, "white");
        squares[1][i].setPiece(pawn1);
    }

    for (int i = 0; i < ChessGame.EIGHT; i += 7) {
        Rook rook1 = new Rook(0, i, 1, "white");
        squares[0][i].setPiece(rook1);
    }

    for (int i = 1; i < ChessGame.EIGHT; i += 5) {
        Knight knight1 = new Knight(0, i, 1, "white");
        squares[0][i].setPiece(knight1);
    }

    for (int i = 2; i < ChessGame.EIGHT; i += 3) {
        Bishop bishop1 = new Bishop(0, i, 1, "white");
        squares[0][i].setPiece(bishop1);
    }

    King king1 = new King(0, 4, 1, "white");
    squares[0][4].setPiece(king1);

    Queen queen1 = new Queen(0, 3, 1, "white");
    squares[0][3].setPiece(queen1);

    // black pieces
    for (int i = 0; i < ChessGame.EIGHT; i++) {
        Pawn pawn2 = new Pawn(6, i, 2, "black");
        squares[6][i].setPiece(pawn2);
    }

    for (int i = 0; i < ChessGame.EIGHT; i += 7) {
        Rook rook2 = new Rook(7, i, 1, "black");
        squares[7][i].setPiece(rook2);
    }

    for (int i = 1; i < ChessGame.EIGHT; i += 5) {
        Knight knight2 = new Knight(7, i, 1, "black");
        squares[7][i].setPiece(knight2);
    }

    for (int i = 2; i < ChessGame.EIGHT; i += 3) {
        Bishop bishop2 = new Bishop(7, i, 1, "black");
        squares[7][i].setPiece(bishop2);
    }

    King king2 = new King(7, 4, 1, "black");
    squares[7][4].setPiece(king2);

    Queen queen2 = new Queen(7, 3, 1, "black");
    squares[7][3].setPiece(queen2);

}

public class ButtonListener implements ActionListener {


    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        JButton src = (JButton) e.getSource();

        if (src.getBackground() != Color.DARK_GRAY && src.getBackground() != Color.WHITE) {
            src.setBackground(src.getForeground());
        } else {
            src.setBackground(Color.MAGENTA);
        }

        for (int i = 0; i < ChessGame.EIGHT; i++) {
            for (int j = 0; j < ChessGame.EIGHT; j++) {
                if (squares[i][j].getPiece() != null) {
                    if (btn[i][j] == src) {
                        row1 = i;
                        col1 = j;
                    }
                }
                if (squares[i][j].getPiece() == null) {
                    if (btn[i][j] == src) {
                        row2 = i;
                        col2 = j;
                    }
                }

            }
        }
        System.out.println("row1:" + row1 + " col1:" + col1);
        System.out.println("row2:" + row2 + " col2:" + col2);

    }

}

}

1 个答案:

答案 0 :(得分:0)

您的问题是您从构造函数中调用movePiece(int, int, int, int),并且未必单击2个按钮。已将侦听器添加到每个按钮,但您不知道此时已激活侦听器。因此,row1,col1,row2和col2都设置为当它们尚未启动时所采用的值为0.因此,您确实希望从侦听器调用move方法。类似的东西:

btn[i][j].addActionListener(e -> {
    JButton src = (JButton) e.getSource();
    //Process src to get row1, col1, row2, and col2 as you did
    movePiece(row1, col1, row2, col2);
});

我用一个lambda表达式替换了你的ButtonListener类,但你可以保留它。重要的是你从动作监听器调用movePiece,因为它确保row1,col1,row2和col2都被定义。