Reputation: 418
hello i had a question about JPanel component it is very simple question no coding the question why do i have to add gui component to the JPanel if i can simply adding them to the JFrame directly do i always have to add all the component to JPanel and if i did not do that is that going to effect the appellation in any term
Upvotes: 0
Views: 205
Reputation: 168825
I will give a slightly different answer (or perhaps different emphasis) to the ones already offered.
Let us imagine you develop a GUI that extends frame. Then the user decides they also want an applet. Do you make it again, or refactor the frame such that everything is in a JPanel
that can then be added to wither a frame, or an applet, ..or one card of a CardLayout
or one tab of a JTabbedPane
, or a JDialog
or JWindow
, or one part of a larger layout or..
That last one is handy in that the client might say. "OK that's great, but now add a tool-bar at the top that repeats the actions of the 'Edit' menu." If you had already used the BorderLayout.PAGE_START
of the content pane of a JFrame
, again it would force a refactor. On the other hand if the GUI was devised in a JPanel
, it is simply a matter of adding that GUI to the CENTER
of another panel with BorderLayout
, and adding the tool bar to the PAGE_START
of the other panel. Add the other panel to the (frame, applet, window, tabbed pane tab..) and the job is done.
The bottom line is, the vast majority of real world GUIs use combinations of layouts (even a JFrame
has a number of layouts before we even add anything to it). Those layouts would typically be done in a JPanel
, and to keep everything consistent, we might just as well make the 'top level' component of that hierarchy another JPanel
.
Consider the following GUI. It uses layout padding & borders for white space.
A GUI with no white space can look very 'crowded', so it is generally better to add some.
But you might note that getContentPane()
returns a Container
for which there is no setBorder()
method! That is for historical reasons due to AWT, upon which Swing is heavily based.
The content pane returned for Swing components is typically a Swing based JPanel
to which we can set a border, but there is not contractual guarantee of that, so we need to check instanceof
and then cast it to one. To me that has a 'bad code smell' - for a border, I'd directly create a JPanel
and go from there.
If we need to do custom painting, it is again better to use a JComponent
(or sub-class) since they are double buffered by default. Again for historical reasons based around AWT, a JFrame
is not double buffered.
Further, while we would always @Override
the paintComponent(Graphics)
method in a JComponent
(or JPanel
etc.), the JFrame
has no such method. Custom painting in a frame would require us to override the paint(Graphics)
method and take care of double buffering ourselves.
So while it is possible to add components directly to a frame:
Altogether better to develop the GUI in a JPanel
.
Upvotes: 3
Reputation: 83
many gui components can't be added in JFrame directly. for example you can't directly add a image as background in JFrame. there are many other controls which you can't use only by JFrame.
Upvotes: 0
Reputation: 347184
Technically, yes, you can add controls directly to a frame without first adding to some kind of container (when I say this, you are actually adding content to the frame's content pane, not the frame itself).
The main reason this tends to be discouraged is to looks you into using a JFrame
and makes it difficult to reuse your UI again some where else.\
The other reason you might consider adding components to a container first is that it can make it easier to develop complex interfaces. This allows you to seperate your UI into sections and focus on the layout requirements of these sections, which might include adding other sub containers to it.
This is commonly known as compound layout management
Upvotes: 1
Reputation: 285405
You don't have to add things to "the JPanel" but can add them directly to the JFrame, but understand a few things:
add(...)
method, you're actually adding it to the JFrame's contentPane...Upvotes: 4