setVisible : Java Glossary


setVisible
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 done.

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 lives.

How are invisible elements treated?

  1. 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?
  2. Is there just a blank hole marking their place?
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.

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 the parent.

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.

Summary

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.

Learning More

Oracle’s Javadoc on setVisible class : available:

This page is posted
on the web at:

http://mindprod.com/jgloss/setvisible.html

Optional Replicator mirror
of mindprod.com
on local hard disk J:

J:\mindprod\jgloss\setvisible.html
logo
Please the feedback from other visitors, or your own feedback about the site.
Contact Roedy. Please feel free to link to this page without explicit permission.
Blog
IP:[65.110.21.43]
Your face IP:[54.237.245.159]
You are visitor number