Your super.paint() call is causing to paintComponent() to get called again, hence the infinite loop and stack overflow.
You shouldn't really need a super.paint() call in your paintComponent() method if you are just painting the background. If anything, it would be a super.paintComponent() instead of paint(), since that is the one you are overriding.