dispose() alone is sufficient. And that's a good practice, to always dispose() your windows. If you don't, the window will keep the Event Dispatcher
Thread alive and your application will never properly exit unless you call System.exit(X). This is problematic since JFrame and JDialog both have HIDE_ON_CLOSE as the default close operation. Just last month I had to fix this at work because someone less known with Swing* didn't know about this. It would have been better if DISPOSE_ON_CLOSE were the default; if people really don't need the window to be disposed they can always change it.
We usually build web applications.