# Class FlowLayout

java.lang.Object
com.codename1.ui.layouts.Layout
com.codename1.ui.layouts.FlowLayout

public class FlowLayout extends Layout

FlowLayout is the default layout manager for Codename One Containers and Forms. It places components in a row one after another based on their preferred size. When it reaches the edge of the container it will break a line and start a new row.

    Form hi = new Form("Flow Layout", new FlowLayout());
    hi.add(new Label("First")).
        add(new Label("Second")).
        add(new Label("Third")).
        add(new Label("Fourth")).
        add(new Label("Fifth"));
    hi.show();

Since flow layout isn't a constraint based layout it has a bunch of very useful enclose methods that can significantly reduce the code required to create the same UI e.g.:

    Container flowLayout = FlowLayout.encloseIn(new Label("First"),
            new Label("Second"),
            new Label("Third"),
            new Label("Fourth"),
            new Label("Fifth"));

This class works nicely for simple elements, however since Codename One doesn't reflow recursively (for performance) it can't accurately handle complex layouts. As a result when an element of varying size is placed in a flow layout this confuses the line breaking logic and fails in odd ways. That is why this layout should only be used for relatively simple use cases.

Flow layout supports aligning the component horizontally and vertically, it defaults to the top left alignment for LTR languages. E.g. the following alignments are supported thru the usage of `setAlign` & `setValign`.

E.g. you can align to the center

You can align to the right

You can align to the center and the middle horizontally

There are quite a few additional combinations that are possible with these API's.

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `FlowLayout()`
  Creates a new instance of FlowLayout with left alignment
  `FlowLayout(int orientation)`
  Creates a new instance of FlowLayout with the given orientation one of LEFT, RIGHT or CENTER
  `FlowLayout(int orientation, int valign)`
  Creates a new instance of FlowLayout with the given orientation one of LEFT, RIGHT or CENTER and the vertical orientation
  `FlowLayout(int orientation, int valign, boolean vAlignByRow)`
  Creates a new instance of FlowLayout with the given orientation one of LEFT, RIGHT or CENTER and the vertical orientation

- ## Method Summary

  Modifier and Type
  Method
  Description
  `static Container`
  `encloseBottom(Component... cmps)`
  Shorthand for Container.encloseIn(new FlowLayout(Component.LEFT, Component.BOTTOM), cmps);
  `static Container`
  `encloseBottomByRow(Component... cmps)`
  Shorthand for Container.encloseIn(new FlowLayout(Component.LEFT, Component.BOTTOM, true), cmps);
  `static Container`
  `encloseCenter(Component... cmps)`
  Shorthand for Container.encloseIn(new FlowLayout(Component.CENTER), cmps);
  `static Container`
  `encloseCenterBottom(Component... cmps)`
  Shorthand for Container.encloseIn(new FlowLayout(Component.CENTER, Component.BOTTOM), cmps);
  `static Container`
  `encloseCenterBottomByRow(Component... cmps)`
  Shorthand for Container.encloseIn(new FlowLayout(Component.CENTER, Component.BOTTOM, true), cmps);
  `static Container`
  `encloseCenterMiddle(Component... cmps)`
  Shorthand for Container.encloseIn(new FlowLayout(Component.CENTER, Component.CENTER), cmps);
  `static Container`
  `encloseCenterMiddleByRow(Component... cmps)`
  Shorthand for Container.encloseIn(new FlowLayout(Component.CENTER, Component.CENTER, true), cmps);
  `static Container`
  `encloseIn(Component... cmps)`
  Shorthand for `com.codename1.ui.Component...)` with a `FlowLayout instance` see:
  `static Container`
  `encloseLeftMiddle(Component... cmps)`
  Shorthand for Container.encloseIn(new FlowLayout(Component.LEFT, Component.CENTER), cmps);
  `static Container`
  `encloseLeftMiddleByRow(Component... cmps)`
  Shorthand for Container.encloseIn(new FlowLayout(Component.LEFT, Component.CENTER, true), cmps);
  `static Container`
  `encloseMiddle(Component... cmps)`
  Shorthand for Container.encloseIn(new FlowLayout(Component.LEFT, Component.CENTER), cmps);
  `static Container`
  `encloseMiddleByRow(Component... cmps)`
  Shorthand for Container.encloseIn(new FlowLayout(Component.LEFT, Component.CENTER, true), cmps);
  `static Container`
  `encloseRight(Component... cmps)`
  Shorthand for Container.encloseIn(new FlowLayout(Component.RIGHT), cmps);
  `static Container`
  `encloseRightBottom(Component... cmps)`
  Shorthand for Container.encloseIn(new FlowLayout(Component.RIGHT, Component.BOTTOM), cmps);
  `static Container`
  `encloseRightBottomByRow(Component... cmps)`
  Shorthand for Container.encloseIn(new FlowLayout(Component.RIGHT, Component.BOTTOM, true), cmps);
  `static Container`
  `encloseRightMiddle(Component... cmps)`
  Shorthand for Container.encloseIn(new FlowLayout(Component.RIGHT, Component.CENTER), cmps);
  `static Container`
  `encloseRightMiddleByRow(Component... cmps)`
  Shorthand for Container.encloseIn(new FlowLayout(Component.RIGHT, Component.CENTER, true), cmps);
  `boolean`
  `equals(Object o)`
  `protected void`
  `fillRow(Container target, int width, int start, int end)`
  This method tries to fill up the available space in a row.
  `int`
  `getAlign()`
  Alignment of the flow layout, defaults to LEFT
  `Dimension`
  `getPreferredSize(Container parent)`
  Returns the container preferred size
  `int`
  `getValign()`
  Indicates vertical alignment within the flow layout
  `int`
  `hashCode()`
  `boolean`
  `isFillRows()`
  Indicates whether the layout manager should try to fill up the available space in the row
  `boolean`
  `isValignByRow()`
  Returns whether vertical alignment is done internally or externally
  `void`
  `layoutContainer(Container parent)`
  Layout the given parent container children
  `void`
  `setAlign(int orientation)`
  Alignment of the flow layout, defaults to LEFT
  `void`
  `setFillRows(boolean fillRows)`
  Indicates whether the layout manager should try to fill up the available space in the row
  `void`
  `setValign(int valign)`
  Indicates vertical alignment within the flow layout
  `void`
  `setValignByRow(boolean internal)`
  When set to true vertical alignment will be performed by row (components within the container will be aligned vertically to each other in the same row) When set to false (which is default) vertical alignment relates to the alignment of this container in regards to external components
  `String`
  `toString()`

  ### Methods inherited from class Layout

  `addLayoutComponent, cloneConstraint, getChildrenInTraversalOrder, getComponentConstraint, isConstraintTracking, isOverlapSupported, obscuresPotential, overridesTabIndices, removeLayoutComponent, updateTabIndices`

  ### Methods inherited from class Object

  `clone, finalize, getClass, notify, notifyAll, wait, wait, wait`

- ## Constructor Details

  - ### FlowLayout

    public FlowLayout()
    Creates a new instance of FlowLayout with left alignment

  - ### FlowLayout

    public FlowLayout(int orientation)

    Creates a new instance of FlowLayout with the given orientation one of LEFT, RIGHT or CENTER

    ###### Parameters

    - `orientation`: the orientation value

  - ### FlowLayout

    public FlowLayout(int orientation, int valign)

    Creates a new instance of FlowLayout with the given orientation one of LEFT, RIGHT or CENTER and the vertical orientation

    ###### Parameters

    - `orientation`: the orientation value

    - `valign`: the vertical orientation one of Component.TOP/BOTTOM/CENTER

  - ### FlowLayout

    public FlowLayout(int orientation, int valign, boolean vAlignByRow)

    Creates a new instance of FlowLayout with the given orientation one of LEFT, RIGHT or CENTER and the vertical orientation

    ###### Parameters

    - `orientation`: the orientation value

    - `valign`: the vertical orientation one of Component.TOP/BOTTOM/CENTER

    - `vAlignByRow`: whether vertical alignment should be computed by row elements

- ## Method Details

  - ### encloseIn

    public static Container encloseIn(Component... cmps)

    Shorthand for `com.codename1.ui.Component...)` with a `FlowLayout instance` see:

        Container flowLayout = FlowLayout.encloseIn(new Label("First"),
                new Label("Second"),
                new Label("Third"),
                new Label("Fourth"),
                new Label("Fifth"));

    ###### Parameters

    - `cmps`: the components to enclose in a new container

    ###### Returns

    the new container

  - ### encloseCenter

    public static Container encloseCenter(Component... cmps)

    Shorthand for Container.encloseIn(new FlowLayout(Component.CENTER), cmps);

    ###### Parameters

    - `cmps`: the components to enclose in a new container

    ###### Returns

    the new container

  - ### encloseRight

    public static Container encloseRight(Component... cmps)

    Shorthand for Container.encloseIn(new FlowLayout(Component.RIGHT), cmps);

    ###### Parameters

    - `cmps`: the components to enclose in a new container

    ###### Returns

    the new container

  - ### encloseMiddle

    public static Container encloseMiddle(Component... cmps)

    Shorthand for Container.encloseIn(new FlowLayout(Component.LEFT, Component.CENTER), cmps);

    ###### Parameters

    - `cmps`: the components to enclose in a new container

    ###### Returns

    the new container

  - ### encloseMiddleByRow

    public static Container encloseMiddleByRow(Component... cmps)

    Shorthand for Container.encloseIn(new FlowLayout(Component.LEFT, Component.CENTER, true), cmps);

    ###### Parameters

    - `cmps`: the components to enclose in a new container

    ###### Returns

    the new container

  - ### encloseCenterMiddle

    public static Container encloseCenterMiddle(Component... cmps)

    Shorthand for Container.encloseIn(new FlowLayout(Component.CENTER, Component.CENTER), cmps);

    ###### Parameters

    - `cmps`: the components to enclose in a new container

    ###### Returns

    the new container

  - ### encloseCenterMiddleByRow

    public static Container encloseCenterMiddleByRow(Component... cmps)

    Shorthand for Container.encloseIn(new FlowLayout(Component.CENTER, Component.CENTER, true), cmps);

    ###### Parameters

    - `cmps`: the components to enclose in a new container

    ###### Returns

    the new container

  - ### encloseRightMiddle

    public static Container encloseRightMiddle(Component... cmps)

    Shorthand for Container.encloseIn(new FlowLayout(Component.RIGHT, Component.CENTER), cmps);

    ###### Parameters

    - `cmps`: the components to enclose in a new container

    ###### Returns

    the new container

  - ### encloseRightMiddleByRow

    public static Container encloseRightMiddleByRow(Component... cmps)

    Shorthand for Container.encloseIn(new FlowLayout(Component.RIGHT, Component.CENTER, true), cmps);

    ###### Parameters

    - `cmps`: the components to enclose in a new container

    ###### Returns

    the new container

  - ### encloseLeftMiddle

    public static Container encloseLeftMiddle(Component... cmps)

    Shorthand for Container.encloseIn(new FlowLayout(Component.LEFT, Component.CENTER), cmps);

    ###### Parameters

    - `cmps`: the components to enclose in a new container

    ###### Returns

    the new container

  - ### encloseLeftMiddleByRow

    public static Container encloseLeftMiddleByRow(Component... cmps)

    Shorthand for Container.encloseIn(new FlowLayout(Component.LEFT, Component.CENTER, true), cmps);

    ###### Parameters

    - `cmps`: the components to enclose in a new container

    ###### Returns

    the new container

  - ### encloseBottom

    public static Container encloseBottom(Component... cmps)

    Shorthand for Container.encloseIn(new FlowLayout(Component.LEFT, Component.BOTTOM), cmps);

    ###### Parameters

    - `cmps`: the components to enclose in a new container

    ###### Returns

    the new container

  - ### encloseCenterBottom

    public static Container encloseCenterBottom(Component... cmps)

    Shorthand for Container.encloseIn(new FlowLayout(Component.CENTER, Component.BOTTOM), cmps);

    ###### Parameters

    - `cmps`: the components to enclose in a new container

    ###### Returns

    the new container

  - ### encloseRightBottom

    public static Container encloseRightBottom(Component... cmps)

    Shorthand for Container.encloseIn(new FlowLayout(Component.RIGHT, Component.BOTTOM), cmps);

    ###### Parameters

    - `cmps`: the components to enclose in a new container

    ###### Returns

    the new container

  - ### encloseBottomByRow

    public static Container encloseBottomByRow(Component... cmps)

    Shorthand for Container.encloseIn(new FlowLayout(Component.LEFT, Component.BOTTOM, true), cmps);

    ###### Parameters

    - `cmps`: the components to enclose in a new container

    ###### Returns

    the new container

  - ### encloseCenterBottomByRow

    public static Container encloseCenterBottomByRow(Component... cmps)

    Shorthand for Container.encloseIn(new FlowLayout(Component.CENTER, Component.BOTTOM, true), cmps);

    ###### Parameters

    - `cmps`: the components to enclose in a new container

    ###### Returns

    the new container

  - ### encloseRightBottomByRow

    public static Container encloseRightBottomByRow(Component... cmps)

    Shorthand for Container.encloseIn(new FlowLayout(Component.RIGHT, Component.BOTTOM, true), cmps);

    ###### Parameters

    - `cmps`: the components to enclose in a new container

    ###### Returns

    the new container

  - ### layoutContainer

    public void layoutContainer(Container parent)

    Layout the given parent container children

    ###### Parameters

    - `parent`: the given parent container
    Specified by:
      `layoutContainer` in class `Layout`

  - ### fillRow

    protected void fillRow(Container target, int width, int start, int end)

    This method tries to fill up the available space in a row. This method is called if isFillRows() returns true.

    ###### Parameters

    - `target`: the parent container

    - `width`: the width of the row to fill

    - `start`: the index of the first component in this row

    - `end`: the index of the last component in this row

  - ### getPreferredSize

    public Dimension getPreferredSize(Container parent)

    Returns the container preferred size

    ###### Parameters

    - `parent`: the parent container

    ###### Returns

    the container preferred size

    Specified by:
      `getPreferredSize` in class `Layout`

  - ### toString

    public String toString()
    Overrides:
      `toString` in class `Object`

  - ### isFillRows

    public boolean isFillRows()

    Indicates whether the layout manager should try to fill up the available space in the row

    ###### Returns

    the fillRows

  - ### setFillRows

    public void setFillRows(boolean fillRows)

    Indicates whether the layout manager should try to fill up the available space in the row

    ###### Parameters

    - `fillRows`: the fillRows to set

  - ### getValign

    public int getValign()

    Indicates vertical alignment within the flow layout

    ###### Returns

    Component.TOP/BOTTOM/CENTER

  - ### setValign

    public void setValign(int valign)

    Indicates vertical alignment within the flow layout

    ###### Parameters

    - `valign`: one of Component.TOP/BOTTOM/CENTER

  - ### isValignByRow

    public boolean isValignByRow()

    Returns whether vertical alignment is done internally or externally

    ###### Returns

    whether vertical alignment is done internally or externally

  - ### setValignByRow

    public void setValignByRow(boolean internal)

    When set to true vertical alignment will be performed by row (components within the container will be aligned vertically to each other in the same row) When set to false (which is default) vertical alignment relates to the alignment of this container in regards to external components

    ###### Parameters

    - `internal`: true for internal, false otherwise

  - ### getAlign

    public int getAlign()

    Alignment of the flow layout, defaults to LEFT

    ###### Returns

    the orientation

  - ### setAlign

    public void setAlign(int orientation)

    Alignment of the flow layout, defaults to LEFT

    ###### Parameters

    - `orientation`: the orientation to set

  - ### equals

    public boolean equals(Object o)
    Overrides:
      `equals` in class `Layout`

  - ### hashCode

    public int hashCode()
    Description copied from class: `Layout`
    Overrides:
      `hashCode` in class `Layout`