# Java: Layouts

Layouts tell Java where to put components in containers (`JPanel`, content pane, etc). Every panel (and other containers) has a default layout, but it's better to set the layout explicitly for clarity.

Create a new layout object (using one of its constructors) and use the container's `setLayout` method to set the layout. Each layout has its own way to resize components to fit the layout, and you must become familiar with these.

## General advice

.

- Initial Iterations. To quickly get the first iterations of a program running, use `FlowLayout`. The result is often ugly, but if there are only a few components, it's quick. `FlowLayout` is rarely the correct layout to use in a finished program.
- Simple programs. `BorderLayout` is often a good layout for simple programs. More complicated layouts can often be nesting `BorderLayout`s within other `BorderLayout`s. This and `FlowLayout` are the most important layouts for beginners.
- Grids of equal sized elements (eg, a calculator keypad), can be created with with `GridLayout`.
- Single Rows or colums of components are sometimes best done with `BoxLayout`.
- More complicated layouts may require `GridBagLayout`. Getting a `GridBagLayout` to work correctly can be time-consuming, but it produces excellent results.

## More notes

- FlowLayout - left to right, top to bottom. Good for initial testing. FlowLayout does not respect preferred size information, so it may make variable size elements (eg, a graphics panel) extremely small.
- BorderLayout - north, east, south, west, and center areas. Has various rules for how components are stretched to fit these areas. Both common and useful.
- GridLayout - equal sized grid elements.
- BoxLayout and Boxes - horizontal or vertical sequence of components.
- GridBagLayout - unequal sized grid. Can produce excellent results, but can be difficult to use.
- `SpringLayout` was added in Java 1.4, but is difficult for humans. It is rumored to be intended for authomatic layout programs..
- `CardLayout` is good for something like a wizard interface which shows one of several possible layouts (think about a stack of index cards). Tabbed panes are something like a card layout with tabs.
- The Null layout (absolute positioning) is possible, but is a bad idea.
- Tabbed panes are something like a card layout with tabs. They are not implemented as a layout, but as a type of panel.
- Non-standard layout managers. Because of deficiencies in the standard Java layout managers, several good, free, alternatives exist.
- You can even define your own layout manager, but this isn't a trivial amount of work. Sun's How to Build a Layout Manager article, java.sun.com/developer/technicalArticles/Interviews/LayoutMgr/, gives a description of the process, altho it is rather unclearly written.