This is great information. I can see how the containing JPanel might help now -- and I got a little history lesson too ;)
Thanks so much Michèle and Mihai for your responses. Mike On Jul 22, 3:31 am, Mihai DINCA <[email protected]> wrote: > Hi Mike > > You must know that Java Swing is like Kung Fu: it's more than a sport, > it's a philosophy. And before being able to fully taking advantages of > its benefits one must learn how to raise bonsais, carry the water and > wash the windows for at least a couple of years :-) > > Now, as far as I know (I must confess I have skipped some windows > washing classes, not to speak about my bonsais), a JFrame is the parent > of several embedded containers that allow fancy effects: > -- The RootPane (use myFrame.getRootPane() to grab it) is a JRootPane > (derived from Component); its role is to contain the GlassPane and the > LayeredPane > -- The LayeredPane (use myFrame.getLayeredPane() or > myFrame.getRootPane.getLayeredPane()) is a JLayeredPane derived from > JComponent derived from Container derived from Component; it contains > several graphical "layers" (in the z-Order) with specific functions; it > is the container for the frame menu and for the ContentPane > -- The GlassPane (use myFrame.getGlassPane() or > myFrame.getRootPane.getGlassPane() or > myFrame.getRootPane.getLayeredPane.getGlassPane() ...) is an AWT > Component (or some derived class); it is a transparent layer above the > Frame contents and allows to add some fancy effects, such as obscuring > the whole Frame, to display additional fancy messages or controls and to > intercept user input (for e.g., to display an input aid while typing) > -- The ContentPane (myFrame.getContentPane() or ...) is an AWT Container > (or some derived class - in practice it is a JPanel, but you can replace > it by any AWT Container); it displays (or draws if you prefer) the > Components of the Frame. > > The description of whole structure can be found in the Sun tutorials > about Swing (I don't have the URL under my hand) but the role of each > component is not too explicit. > > You can (1) directly add the JFrame Components to the ContentPane > (including specifying its LayoutManager). In fact, the "add" methods of > the JFrame are overridden so they call the corresponding "add" methods > of the ContentPane (same for the LayoutManager management methods). > > Or you can (2) create your own Container, such as a JPanel, add > Components to it and replace the ContentPane of your JFrame. > > Or you can (3) use your own JPanel to add Components and play with the > LayoutManager and, in the end, add it to the (ContentPane of the) JFrame. > > The simplest ways is to use the first method. However some people prefer > the methods 2 and 3 for some reasons and consider doing so as a "best > practice". > > One of the reason is that you can work to your JPanel and all the logic > behind without asking yourself about the final enclosing container. Then > decide (eventually at execution time) to display it in a JFrame (and let > the user play with several things on the screen including your JPanel) > or in a modal JDialog (so to prevent the user to touch anything else as > long as your JPanel is in sight) or in a JApplet (because the user > requested your JPanel over the Internet or the company Intranet). > > I think that another (historical) reason was caused by the fact that > displaying Swing controls used to be very slow on 32MB Windows 95 > systems (or so). So it was a common practice to display some splash > screen while constructing the content of the JPane then had quickly > displayed the whole when the JPane was added to the Frame. > > The last but not the least reason is the ability to quickly change the > content of the JFrame. Just have two contextual JPanes ready to be > displayed and replace the ContentPane with the one that fits your > context at that moment. Then change it again when the context changes. > > For other fancy effects one can produce by taking advantage of the > JFrame layered structure, I found the O'Reilly's book "Swing Hacks - > Tips and Tools for Building Killer GUIs", by Marinacci & Adamson. It > implies some windows washing and meditation too so I cannot say I am an > expert in killer GUIs based applications, but it worth to take a look at it. > > Hope it helps > Mihai > > Mike M. Lin a �crit : > > > > > Thanks for the link, Mich�le. The interesting thing is that I didn't > > need to the create a JPanel to do my layout. Immediately after > > creating my JFrame, I just set the layout directly on it. > > > JFrame frame = new JFrame("It's time to play SHOW THAT FLAG"); > > frame.setLayout(new BoxLayout( > > frame.getContentPane(), BoxLayout.PAGE_AXIS)); > > > This > > article,http://weblogs.java.net/blog/hansmuller/archive/2005/11/jframeadd_con..., > > explains that this is actually an illusion -- a convenience feature > > that actually sets the layout on the content pane of the frame. The > > above is equivalent to this: > > > JFrame frame = new JFrame("It's time to play SHOW THAT FLAG"); > > frame.getContentPane().setLayout(new BoxLayout( > > frame.getContentPane(), BoxLayout.PAGE_AXIS)); > > > Even more interesting is that I never set the content pane of the > > frame before setting the content pane's layout. How can I set the > > layout on an object that doesn't exist? What I found out is that > > every JFrame comes with a default content pane. What type of object > > is it? Well let's find out... > > > public static void main(String[] args) { > > JFrame frame = new JFrame(); > > System.out.println("frame.getContentPane() is a " > > + frame.getContentPane().getClass().getName()); > > } > > > run: > > frame.getContentPane() is a javax.swing.JPanel > > BUILD SUCCESSFUL (total time: 2 seconds) > > > It's actually a JPanel. So if the JFrame already includes a default > > content pane that's a JPanel, then why create another JPanel to slap > > on top of it? In the LunarPhases example (http://137.166.68.100/java- > > tut/uiswing/learn/example5.html), they could have done without the > > mainPanel and instead added the selectPanel and displayPanel to the > > lunarPhasesFrame's content pane. > > > One possible advantage that I could see is that the mainPanel is used > > to throw a border around the edges of the frame so that the > > selectPanel and displayPanel don't seem so cramped. If that's what > > the purpose was, then it wasn't clear to me from reading the tutorial. > > > Thanks, > > Mike > > > On Jul 21, 2:21 am, Mich�le Garoche <[email protected]> wrote: > > >> On 21 juil, 10:16, "Mike M. Lin" <[email protected]> wrote:> In the > >> Swing homework, the example we key off of (lunar images) is set > > >>> up with a JFrame which holds a JPanel. that JPanel acts as a container > >>> for two other JPanel's - one to house the combo box, the other to > >>> house the image. > > >>> What is the purpose of the containing JPanel? I did my homework > >>> assignment without that container and it seems to work just fine. I > >>> just put my sub-panels directly on the JFrame. > > >>> It seems pretty useless to me in this program. What am I missing? > > >> You may have a look at this > >> tutorial:http://download.oracle.com/docs/cd/E17409_01/javase/tutorial/uiswing/... > >> Especially the section Tips on choosing a Layout Manager. -- To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/javaprogrammingwithpassion?hl=en
