Yes, you can draw on a JPanel and it automatically double buffers. ra4king is adamant that JComponent is better. There are probably good reasons and I defer to him, as I'm kind of cruising on the surface level of Java in many respects and have never used JComponent. But if you are looking for simplicity, you CAN do this:
Top level, JFrame. Then, instead of trying to do anything fancy with the "content pane" of the JFrame, just add a subclassed JPanel and draw/animate your objects on that. Easy peasy. We are talking beginning, get feet wet, intro to Java game programming, nothing fancy. But one can do a fair bit with this set up.
I think the main hazard/complication is that repaint() calls have to be done from some vantage point other than the JPanel itself, due to an aspect of "passive rendering". If you put your game loop or timer on the JPanel with the animation, the Event Dispatch Thread will think it can be "more efficient" by collapsing the repaint calls together rather than treating each one as a separate event.
So, my solution has been to create a separate class with a Timer and have the Timer call the JPanel's repaint() function. I use the java.util timer, and set it to repeat calls every 30 msec or thereabouts. But you could do something similar with a game loop. Main point, the game loop or timer should not be part of the JPanel class you are animating.
Do I hear howls of disagreement?

One can refactor in active rendering or other fancier animation schemes later.