Once you get a little experience using these classes, I think you'll see that these aren't really equivalent alternatives; you'll need some element of all of these in most of your Swing applications.
Subclassing JPanel (or another similar class) is what you must do to use custom painting. If you need to draw any kind of graphics, then you need to implement paintComponent() , and to do that, you need some subclass of JComponent. If you're not painting, then you don't need to do that.
Subclassing JFrame is something you'll have to do when you want to customize how a top-level window behaves. It's also something you'll see done in small example programs just because main() has to go
somewhere; this isn't done that much in the real world, but it's convenient for small programs.
Creating independent classes with member variables holding frames and panels and things, as in your third alternative, is quite common. But of course it can be and is done in combination with the other two -- i.e., member variables holding
subclasses of JFrame and JPanel etc.
So generally
you should just use whatever is convenient and appropriate; you'll learn what that is over time.