Правильное обновление позиций компонентов на панели кнопок в JavaJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Правильное обновление позиций компонентов на панели кнопок в Java

Сообщение Anonymous »

Я пытаюсь написать базовую игру в шашки на Java, мне хотелось бы иметь возможность перемещать компоненты фигур по панели кнопок с правильно обновляемыми позициями.
Текущая проблема заключается в том, что как только я передвигаю фигуру, я не могу переместить ее снова. Метод HighlightPossibleMoves работает один раз для каждого фрагмента.
Я добавил код, чтобы проверить, существует ли настоящий фрагмент, и обнаружил, что координаты кнопок, которые я нажимал, не были на самом деле то, что я думал, например, результат будет...
"Перемещение из ячейки [5,1] -
Кнопка в [5][1] имеет Компонентов: 1. -
Всего слушателей действий: 64 -
Счетчик ходов равен 4 -
черная фигура находится в [4,2] -
Есть черная фигура в [4, 2]"
но затем, когда я нажимаю на фрагмент, который ДОЛЖЕН быть в [4,2], я получаю этот вывод...
" В исходной ячейке [5,1] нет фрагмента».
Это объясняет, почему Java говорит, что в кнопках нет компонентов там, где ДОЛЖНЫ быть компоненты. Неправильно собирает правильные координаты для кнопки источника.
Поэтому я попробовал следующее:
Создание новых исходных переменных для изоляции исходных координат
Отключение и повторное включение прослушивателя действий для кнопки, из которой был перемещен фрагмент
При использовании этих подходов я получаю ту же ошибку или выдает это исключение...

Код: Выделить всё

java.lang.ArrayIndexOutOfBoundsException: No such child: 0
at java.desktop/java.awt.Container.getComponent(Container.java:354)
at Board.highlightPossibleMoves(Board.java:182)
at Board$2.actionPerformed(Board.java:125)
Это код, соответствующий моей проблеме, за вычетом всех моих операторов отладки.

Код: Выделить всё

private void initializeButtons(){
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
final int row = i;
final int col = j;
buttons[i][j] = new JButton();
buttons[i][j].setFocusable(false);
buttons[i][j].setOpaque(true);buttons[i][j].addActionListener(new ActionListener({
@Override
public void actionPerformed(ActionEvent e) {
try {
highlightPossibleMoves(row, col);
pressedStates[row][col] = true;
catch (Exception ex) {
ex.printStackTrace();
}
}
});
buttonPanel.add(buttons[i][j]);
}
}
}

private void highlightPossibleMoves(int row, int col) {
resetBoard();

String pieceColor = ((Piece) buttons[row][col].getComponent(0)).getSide();

int[] dx;
int[] dy;

if (pieceColor.equals("red")) {
dx = new int[]{1, 1};
dy = new int[]{1, -1};
else {
dx = new int[]{-1, -1};
dy = new int[]{-1, 1};
}

for (int i = 0; i < 2; i++) {

int newRow = row + dx[i];
int newCol = col + dy[i];

int jumpRow = row + 2 * dx[i];
int jumpCol = col + 2 * dy[i];

if (isValidCell(newRow, newCol) && buttons[newRow][newCol].getComponentCount() == 0){

buttons[newRow][newCol].setBackground(HIGHLIGHT_COLOR);
addActionListenerForMove(row, col, newRow, newCol);

else if (isValidCell(newRow, newCol) && buttons[newRow][newCol].getComponentCount() != 0 && isValidCell(jumpRow, jumpCol) && buttons[jumpRow][jumpCol].getComponentCount() == 0 && ((Piece) buttons[newRow[newCol].getComponent(0)).getSide().equals(getOpponentSide(pieceColor)){
buttons[jumpRow][jumpCol].setBackground(HIGHLIGHT_COLOR);
addActionListenerForMove(row, col, jumpRow, jumpCol);
}
}
}

private void addActionListenerForMove(int fromRow, int fromCol, int toRow, int toCol) {
ActionListener[] listeners = buttons[toRow][toCol].getActionListeners();
for (ActionListener listener : listeners) {
buttons[toRow][toCol].removeActionListener(listener);
}

buttons[toRow][toCol].addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Move(fromRow, fromCol, toRow, toCol);
}
});
}

private void resetBoard() {
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if ((i + j) % 2 == 0) {
buttons[i][j].setBackground(COLOR_1);
buttons[i][j].setOpaque(true);
else {
buttons[i][j].setBackground(COLOR_2);
buttons[i][j].setOpaque(true);
}
}
}
}
private boolean isValidCell(int row, int col) {
return row >= 0 && row < 8 && col >= 0 && col < 8;
}

private void Move(int i, int j, int newRow, int newCol) {

if (buttons[i][j].getComponentCount() > 0) {
Piece myPiece = (Piece) buttons[i][j].getComponent(0);

if (buttons[newRow][newCol].getComponentCount() == 0) {
buttons[newRow][newCol].add(myPiece);
buttons[i][j].remove(myPiece);
buttons[i][j].repaint();
resetBoard();

int jumpedRow = (i + newRow) / 2;
int jumpedCol = (j + newCol) / 2;

if (Math.abs(i - newRow) == 2 && Math.abs(j - newCol) == 2) {
buttons[jumpedRow][jumpedCol].removeAll();
buttons[jumpedRow][jumpedCol].repaint();
}
else {
System.out.println("No piece in cell [" + i + "," + j + "]");
}
}
else {
System.out.println("There is no piece in the source cell [" + i + "," + j + "]"  );

}
}
Моя цель — научиться перемещать фигуры в соответствии с классической игрой в шашки, но я не знаю, как к этому подойти здесь, поскольку это настолько важная часть, что мне нужно исправиться. Я новичок в программировании, поэтому, возможно, мне не хватает чего-то довольно простого, любая помощь очень ценится!


Подробнее здесь: https://stackoverflow.com/questions/783 ... el-in-java
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»