Previous | Next | Trail Map | Creating a GUI with JFC/Swing | Laying Out Components Within a Container

Creating a Custom Layout Manager


Note: Before you start creating a custom layout manager, make sure that no existing layout manager will work. In particular, GridBagLayout and BoxLayout are flexible enough to work in many cases. You can also find layout managers from other sources, such as from the Internet. Finally, you can simplify layout by grouping components into containers such as invisible panels(in the Creating a User Interface trail).

To create a custom layout manager, you must create a class that implements the LayoutManager(in the API reference documentation) interface. You can either implement it directly, or implement its subinterface, LayoutManager2(in the API reference documentation).

Every layout manager must implement at least the following five methods, which are required by the LayoutManager interface:

void addLayoutComponent(String, Component)
Called by the Container add methods. Layout managers that don't associate strings with their components generally do nothing in this method.

void removeLayoutComponent(Component)
Called by the Container remove and removeAll methods. Many layout managers do nothing in this method, relying instead on querying the container for its components, using the Container getComponents method.

Dimension preferredLayoutSize(Container)
Called by the Container getPreferredSize method, which is itself called under a variety of circumstances. This method should calculate and return the ideal size of the container, assuming that the components it contains will be at or above their preferred sizes. This method must take into account the container's internal borders, which are returned by the getInsets method.

Dimension minimumLayoutSize(Container)
Called by the Container getMinimumSize method, which is itself called under a variety of circumstances. This method should calculate and return the minimum size of the container, assuming that the components it contains will be at or above their minimum sizes. This method must take into account the container's internal borders, which are returned by the getInsets method.

void layoutContainer(Container)
Called when the container is first displayed, and each time its size changes. A layout manager's layoutContainer method doesn't actually draw components. It simply invokes each component's resize, move, and reshape methods to set the component's size and position. This method must take into account the container's internal borders, which are returned by the getInsets method. You can't assume that the preferredLayoutSize or minimumLayoutSize method will be called before layoutContainer is called.

Besides implementing the preceding five methods, layout managers generally implement at least one public constructor and the toString method.

If you wish to support component constraints, maximum sizes, or alignment, then your layout manager should implement the LayoutManager2 interface. That interface adds five methods to those required by LayoutManager:

For more information about these methods, see the LayoutManager2 API documentation(in the API reference documentation). Also see the source code for BoxLayout, to see how it implements the LayoutManager2 interface.

When implementing a layout manager, you might want to use SizeRequirements(in the API reference documentation) objects to help you determine the size and position of components. See the source code for BoxLayout for an example of using SizeRequirements.

Here's source code for a custom layout manager named DiagonalLayout. It lays out components diagonally, from left to right, with one component per row. Here's an example of DiagonalLayout in action:

Click this figure to run the applet.
This is a picture of the applet's GUI. To run the applet, click the picture. The applet will appear in a new browser window.


Previous | Next | Trail Map | Creating a GUI with JFC/Swing | Laying Out Components Within a Container