Похоже, проблема не в источнике события мыши. На самом деле, я думаю, что здесь есть две разные вещи, называемые «источником», и вы смешиваете их вместе. Я думаю, что сообщение:
EventDispatchThread.run() line: not available, Source not found
Eclipse сообщает вам, что к библиотеке не присоединен исходный код code , поэтому она не может найти номера строк или показать вам исходный код. Проблема, похоже, не с me.getSource()
.
Проблема в том, что вы пытаетесь сослаться на индекс внутри массива, который находится за пределами массива (отсюда ArrayIndexOutOfBoundsException
в трассировке стека).
Поскольку трассировка стека находится в потоке очереди событий AWT, вероятно, исключение происходит из-за метода mousePressed()
вашего MouseAdapter
. Поскольку вы уже используете Eclipse, я предлагаю вам познакомиться с отладчиком, который чрезвычайно полезен. Поместите точку останова в эти строки:
Vector validMoves = move.DroneMovesNorth[index].Moves;
int totalMoves = move.DroneTotalMovesNorth[index];
И убедитесь, что оба поля массива move
достаточно велики, чтобы ссылаться на элемент в индексе. Если вы не хотите использовать отладчик (я бы действительно рекомендовал именно так), то вы можете заключить эти две строки в ловушку исключения, например:
try {
Vector validMoves = move.DroneMovesNorth[index].Moves;
int totalMoves = move.DroneTotalMovesNorth[index];
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("Exception thrown: index = " + index +
"Array lengths: " + move.DroneMovesNorth.length + ", " +
move.DroneTotalMovesNorth.length);
}
Когда / если исключение обнаружено, вы хотите выяснить , почему индекс больше, чем размер каждого из этих массивов. Это оставлено как упражнение; -)
Редактировать: там есть какой-то другой код, который выглядит подозрительно.
Сначала вы объявляете массив для шахматной доски:
chessBoard = new JPanel[NUMBER_OF_ROWS][NUMBER_OF_COLS];
Затем вы начинаете итерацию для каждого квадрата на доске:
for (int i = 0; i < NUMBER_OF_ROWS; i++) {
for (int j = 0; j < NUMBER_OF_COLS; j++) {
Обратите внимание, что i
будет достигать значения NUMBER_OF_ROWS
, которое является длиной массива шахматной доски. Тогда по какой-то причине я не понимаю, вы меняете значение index
на то, что может быть в 4 раза больше длины массива:
int index = i * 4 + j;
А позже попробуйте указать эту позицию в массиве шахматной доски:
if (!(boardArray.chessBoard[index].square.isEmpty())) {
Это означает, что index
может иметь значение выше NUMBER_OF_ROWS
, и если вы попытаетесь получить доступ к элементу с этим индексом массива, он выдаст ArrayIndexOutOfBoundsException
.
Итак, мое второе предложение было бы еще раз взглянуть на логику, используемую в:
int index = i * 4 + j;
... так как это тоже может быть проблемой.
P.S. отладчик в Eclipse потрясающий, вы должны его использовать; -)