Generally, JFrames are used for fully-fledged Java applications. It's not necessary to over-ride this class, but to simply write event listeners that take in the JFrame/some other component and perform the necessary actions from the event listener. This prevents you from ending up with one massive class at the end, which makes debugging a nightmare.
If you need a custom component, I'd suggest over-ridding the closest component to it, for example I generally over-ride the JPanel class when I need some sort of canvas to do custom painting with (like a plotting utility).
Another advantage of over-riding the JPanel class is that you can very easily inter-change between full Java applications and Applets by simply setting the content pane of either the Applet or of the JFrame (almost no change required).