Ваша проблема в несколько раз, но прежде всего вы понимаете, что объект Graphics, переданный в метод paint или paintComponent, обычно не сохраняется и может быть удален после его завершения. Затем у вас есть логика программы, вызываемая из метода paintComponent, который никогда не должен выполняться. Вы не имеете полного контроля над тем, когда или даже если методы paint или paintComponent вызываются, и, следовательно, они не должны определять логику вашего приложения.
По этой причине вы не делаете графику Swing таким образом. Вместо этого установите таймер вне любого метода paintComponent, обновите его в полях класса, затем вызовите repaint () и попросите ваш paintComponent использовать эти поля класса для рисования по мере необходимости, на этот раз с стабильным объектом Graphics, который передается в него через параметры .
Я понимаю, что ваш код "просто пример", но вы делаете что-то неправильно, пытаясь рисовать прямо из actionPerformed. Вы просто не должны этого делать.