|
|
Start of Tutorial > Start of Trail > Start of Lesson | Search |
Note: Before you start creating a custom layout manager, make sure that no existing layout manager will work. In particular,GridBagLayoutandBoxLayoutare 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.
To create a custom layout manager, you must create a class that implements the
LayoutManagerinterface. You can either implement it directly, or implement its subinterface,
LayoutManager2.
Every layout manager must implement at least the following five methods, which are required by the
LayoutManagerinterface:
void addLayoutComponent(String, Component)- Called by the
Containeraddmethods. Layout managers that don't associate strings with their components generally do nothing in this method.
void removeLayoutComponent(Component)- Called by the
ContainerremoveandremoveAllmethods. Many layout managers do nothing in this method, relying instead on querying the container for its components, using theContainergetComponentsmethod.
Dimension preferredLayoutSize(Container)- Called by the
ContainergetPreferredSizemethod, 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 thegetInsetsmethod.
Dimension minimumLayoutSize(Container)- Called by the
ContainergetMinimumSizemethod, 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 thegetInsetsmethod.
void layoutContainer(Container)- Called when the container is first displayed, and each time its size changes. A layout manager's
layoutContainermethod doesn't actually draw components. It simply invokes each component'sresize,move, andreshapemethods to set the component's size and position. This method must take into account the container's internal borders, which are returned by thegetInsetsmethod. You can't assume that thepreferredLayoutSizeorminimumLayoutSizemethod will be called beforelayoutContaineris called.Besides implementing the preceding five methods, layout managers generally implement at least one public constructor and the
toStringmethod.If you wish to support component constraints, maximum sizes, or alignment, then your layout manager should implement the
LayoutManager2interface. That interface adds five methods to those required byLayoutManager:For more information about these methods, see the
addLayoutComponent(Component, Object)getLayoutAlignmentX(Container)getLayoutAlignmentY(Container)invalidateLayout(Container)maximumLayoutSize(Container)LayoutManager2API documentation. Also see the source code for
BoxLayout, to see how it implements theLayoutManager2interface.When implementing a layout manager, you might want to use
SizeRequirementsobjects to help you determine the size and position of components. See the source code for
BoxLayoutfor an example of usingSizeRequirements.In
DiagonalLayout.java, you can find the source code for a custom layout manager.DialogLayoutlays out components diagonally, from left to right, with one component per row. Here's an example ofDiagonalLayoutin action:
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.You can find another example of a custom layout manager in
GraphPaperLayout.java.GraphPaperLayout, written by Michael Martak, lays out components in a grid. Each component's size and location are specified, using grid units rather than absolute locations, when the component is added to its container. You can set the relative grid size, horizontal space between components, and vertical space between components when initializing the layout manager. You can also change component locations and the grid size dynamically. For an example of usingGraphPaperLayout, seeGraphPaperTest.java. Here's a snapshot ofGraphPaperTestthat showsGraphPaperLayoutin action:
|
|
Start of Tutorial > Start of Trail > Start of Lesson | Search |