setVisible( boolean ) controls whether a Component and its
children are displayed on the screen. setVisible( false ) hides a Component by marking it as invisible. setVisible( true ) reveals a Component by marking it as visible.
hide() and show() are now deprecated.
How SetVisible Works
With setVisible( false ), if the Component is not already marked invisible, setVisible calls
invalidate() which invalidates the Container’s
layout and the chain of parents since there is now more screen real estate in the Container and the positions of the siblings must be adjusted to flow into the freed space.
With setVisible( true ), if the Component is not already marked visible, setVisible calls invalidate() which invalidates the Container’s layout and the
chain of parents since there is now less screen real estate in the Container and the
positions of the siblings must be adjusted to squeeze in this new Component.
Further, setVisible will schedule a repaint if the visibility status actually
changed. However, it won’t schedule the Container.validate() automatically.
That is up to you to do after all your visibility changes to the Components are
show() unhides a component by marking it as visible, allowing it to be painted
again on the next painting cycle. show is deprecated. With Java version 1.1 or later you are supposed to use setVisible( true);
A Component is considered visible if in on any repainting
cycle, it should be repainted. It might not actually be visible on the screen right now because it is occluded,
or because CardLayout is not currently displaying the panel in which the component
How are invisible elements treated?
It depends on the LayoutManager you choose. LayoutManagers are free to choose either strategy. You will have to experiment to find out. If
your LayoutManager uses the first strategy, but you never get around to calling
Container.validate(), your program will behave as if it had used the second.
- Do they act as if they weren’t there at all? Do the other elements move into take over the vacated
space? Is the visual effect the same as removing them from the enclosing Container?
- Is there just a blank hole marking their place?
setVisible has no effect on the visibily flags of the children. Unlike some GUI (Graphic User Interface)
programming systems, when you parent.setVisible( true ) you don’t disturb any
of the children’s visibility flags, and the hidden children will stay hidden, even when you again reveal
Composing A Frame
While you are composing a Frame, you usually would temporarily setVisible( false ), waiting until all the Components are added, before allowing any validate/ repaints to be triggered, then masterFrame.validate() to compute the
layouts then, masterFrame.setVisible( true ) when you were ready for your masterwork
to be revealed.
Unlike ordinary Components, Windows, Frames and JFrames conveniently start out life automatically with
setVisible( false ). Traditionally you do the validate()
and setVisible( true ) in the code that calls the
Frame’s constructor not in the Frame’s
constructor or addNotify method.
Temporarily Hiding Components
For efficiency and to avoid a jittery screen, you should first do all your setVisible( true
) and setVisible( false ) calls which will
invalidate the layout if anything actually changed. Then when you have Component
visibility set the way you want, do your Container.validate() to redo the layout if
necessary and repaint if necessary.
hide() make temporarily invisible. hide is deprecated.
With Java version 1.1 or later you are supposed to use setVisible(
false); instead. hide is also used to describe what one
window does to another when it is painted over top of it.
In summary, the only time you routinely need setVisible is after a Frame or Component has been constructed. At other times you can use it
to temporarily hide or reveal Components. Remember to call Container.validate() to adjust the layout for the newly created or hidden Components. Java can’t schedule that automatically for you, since it has no way of knowing
when your batch of changes is complete. A sign you have forgotten the validate is
that you need to drag your Frame to a new size for your application to work. Resizing
will schedule an invalidate.
Oracle’s Javadoc on setVisible
class : available: