Проблема в том, что ваш массив кнопок имеет размер i, но j может быть больше, чем i. Например, в первый раз вы создаете пустой массив здесь:
JButton[] buttons = new JButton[i];
потому что я равен 0. Затем вы пытаетесь получить к нему доступ по индексу 0, которого нет (так как массив не имеет размера), и вы получите свое исключение. Если вы вместо этого делаете что-то вроде:
JButton[] buttons = new JButton[MAX_COLUMNS];
Таким образом, у вас будет кнопка для каждого расположения массива. Кроме того, вам, вероятно, потребуется инициализировать отдельные кнопки, то есть что-то вроде этого:
for (int k = 0; k < MAX_COLUMNS; k++) {
buttons[k] = new JButton();
}
(отказ от ответственности: код не тестировался, но был извлечен из неизвестного вам места только для примера. Возможны опечатки или невидимые ошибки.)
Удачи.