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

Reply via email to