The multiple JFrame
approach has been something I've implemented since I began programming Swing apps. For the most part, I did it in the beginning because I didn't know any better. However, as I matured in my experience and knowledge as a developer and as began to read and absorb the opinions of so many more experienced Java devs online, I made an attempt to shift away from the multiple JFrame
approach (both in current projects and future projects) only to be met with... get this... resistance from my clients! As I began implementing modal dialogs to control "child" windows and JInternalFrame
s for separate components, my clients began to complain! I was quite surprised, as I was doing what I thought was best-practice! But, as they say, "A happy wife is a happy life." Same goes for your clients. Of course, I am a contractor so my end-users have direct access to me, the developer, which is obviously not a common scenario.
So, I'm going to explain the benefits of the multiple JFrame
approach, as well as myth-bust some of the cons that others have presented.
JFrame
s, you give your end-user the ability to spread out and control what's on his/her screen. The concept feels "open" and non-constricting. You lose this when you go towards one big JFrame
and a bunch of JInternalFrame
s.JFrame
s. However, I wanted the data entry screen to be a JDialog
whose parent was the data viewer. I made the change, and immediately I received a call from an end-user who relied heavily on the fact that he could minimize or close the viewer and keep the editor open while he referenced another part of the program (or a website, I don't remember). He's not on a multi-monitor, so he needed the entry dialog to be first and something else to be second, with the data viewer completely hidden. This was impossible with a JDialog
and certainly would've been impossible with a JInternalFrame
as well. I begrudgingly changed it back to being separate JFrames
for his sanity, but it taught me an important lesson.JInternalFrame
than a JFrame
. In fact, in my experience, JInternalFrames
offer much less flexibility. I have developed a systematic way of handling the opening & closing of JFrame
s in my apps that really works well. I control the frame almost completely from within the frame's code itself; the creation of the new frame, SwingWorker
s that control the retrieval of data on background threads and the GUI code on EDT, restoring/bringing to front the frame if the user tries to open it twice, etc. All you need to open my JFrame
s is call a public static method open()
and the open method, combined with a windowClosing()
event handles the rest (is the frame already open? is it not open, but loading? etc.) I made this approach a template so it's not difficult to implement for each frame.JFrame
needs more space than a JInternalFrame
, even if you open up 100 JFrame
s, how many more resources would you really be consuming? If your concern is memory leaks because of resources: calling dispose()
frees all resources used by the frame for garbage collection (and, again I say, a JInternalFrame
should invoke exactly the same concern).I've written a lot and I feel like I could write more. Anyways, I hope I don't get down-voted simply because it's an unpopular opinion. The question is clearly a valuable one and I hope I've provided a valuable answer, even if it isn't the common opinion.
A great example of multiple frames/single document per frame (SDI) vs single frame/multiple documents per frame (MDI) is Microsoft Excel. Some of MDI benefits:
SDI (Single-Document Interface, i.e., every window can only have a single document):
MDI (Multiple-Document Interface, i.e., every window can have multiple documents):