{  int preferredHeightAll = 0; for (int index = 0; index < children.length; index++) { preferredHeightAll += children[index].getPreferredSize().height; } double heightFactor = (double) innerSize.height / (double) preferredHeightAll;   int heightRemain = innerSize.height; for (int index = 0; index < children.length; index++) { Component comp = children[index]; Dimension sz = comp.getPreferredSize(); Dimension minSize = comp.getMinimumSize(); Dimension maxSize = comp.getMaximumSize(); int height = (int) (sz.height * heightFactor); int width = Math.min(innerSize.width, maxSize.width);  if (height < minSize.height) { height = minSize.height; comp.setSize(width, height); laidOut[index] = true; preferredHeightAll -= sz.height; heightRemain -= height; continue; }  if (height > maxSize.height) { height = maxSize.height; comp.setSize(width, height); laidOut[index] = true; preferredHeightAll -= sz.height; heightRemain -= height; continue; }  }   heightFactor = (double) heightRemain / (double) preferredHeightAll;  int y = insets.top;   for (int index = 0; index < children.length; index++) { Component comp = children[index]; int height = 0;  if (!laidOut[index]) { Dimension sz = comp.getPreferredSize(); Dimension maxSize = comp.getMaximumSize(); height = (int) (sz.height * heightFactor); int width = Math.min(innerSize.width, maxSize.width); comp.setSize(width, height); } else height = comp.getHeight();  int cx = (int) ((innerSize.width - comp.getWidth()) * comp.getAlignmentX() + insets.left); comp.setLocation(cx, y); y = y + height; } }
layoutAlgorithm(parent, VERTICAL, HORIZONTAL);
  public void layoutContainer(Container parent)  {    if (parent != container)      throw new AWTError("invalid parent");        Dimension size = parent.getSize();    Insets insets = parent.getInsets();    Dimension innerSize = new Dimension(size.width - insets.left                                        - insets.right, size.height                                        - insets.bottom - insets.top);    Component[] children = parent.getComponents();    boolean[] laidOut = new boolean[children.length];    for (int index = 0; index < laidOut.length; index++)      laidOut[index] = false;    if (isHorizontalIn(parent))      {        // compute overall preferred width        int preferredWidthAll = 0;        for (int index = 0; index < children.length; index++)          {            preferredWidthAll += children[index].getPreferredSize().width;          }        double widthFactor = (double) innerSize.width /          (double) preferredWidthAll;        // sort out components that are constrained by minimum or maximum size        int widthRemain = innerSize.width;        for (int index = 0; index < children.length; index++)          {            Component comp = children[index];            Dimension sz = comp.getPreferredSize();            Dimension minSize = comp.getMinimumSize();            Dimension maxSize = comp.getMaximumSize();            int width = (int) (sz.width * widthFactor);            int height = Math.min(innerSize.height, maxSize.height);            // check min size            if (width < minSize.width)              {                width = minSize.width;                comp.setSize(width, height);                laidOut[index] = true;                preferredWidthAll -= sz.width;                widthRemain -= width;                continue;              }            // check max size            if (width > maxSize.width)              {                width = maxSize.width;                comp.setSize(width, height);                laidOut[index] = true;                preferredWidthAll -= sz.width;                widthRemain -= width;                continue;              }                      }        // recompute widthFactor for remaining components        widthFactor = (double) widthRemain / (double) preferredWidthAll;        int x = insets.left;        // lay out remaining comonents        for (int index = 0; index < children.length; index++)          {            Component comp = children[index];            int width = 0;            if (!laidOut[index])              {                Dimension sz = comp.getPreferredSize();                Dimension maxSize = comp.getMaximumSize();                width = (int) (sz.width * widthFactor);                int height = Math.min(innerSize.height, maxSize.height);            comp.setSize(width, height);              }            else                width = comp.getWidth();            int cy = (int) ((innerSize.height - comp.getHeight())              * comp.getAlignmentY() + insets.top);            comp.setLocation(x, cy);            x = x + width;                      }      }    else      {        // compute overall preferred height        int preferredHeightAll = 0;        for (int index = 0; index < children.length; index++)          {            preferredHeightAll += children[index].getPreferredSize().height;          }        double heightFactor = (double) innerSize.height /          (double) preferredHeightAll;        // sort out components that are constrained by minimum or maximum size        int heightRemain = innerSize.height;        for (int index = 0; index < children.length; index++)          {            Component comp = children[index];            Dimension sz = comp.getPreferredSize();            Dimension minSize = comp.getMinimumSize();            Dimension maxSize = comp.getMaximumSize();            int height = (int) (sz.height * heightFactor);            int width = Math.min(innerSize.width, maxSize.width);            // check min size            if (height < minSize.height)              {                height = minSize.height;                comp.setSize(width, height);                laidOut[index] = true;                preferredHeightAll -= sz.height;                heightRemain -= height;                continue;              }            // check max size            if (height > maxSize.height)              {                height = maxSize.height;                comp.setSize(width, height);                laidOut[index] = true;                preferredHeightAll -= sz.height;                heightRemain -= height;                continue;              }                      }        // recompute heightFactor for remaining components        heightFactor = (double) heightRemain / (double) preferredHeightAll;        int y = insets.top;        // lay out remaining comonents        for (int index = 0; index < children.length; index++)          {            Component comp = children[index];            int height = 0;            if (!laidOut[index])              {                Dimension sz = comp.getPreferredSize();                Dimension maxSize = comp.getMaximumSize();                height = (int) (sz.height * heightFactor);                int width = Math.min(innerSize.width, maxSize.width);            comp.setSize(width, height);              }            else              height = comp.getHeight();            int cx = (int) ((innerSize.width - comp.getWidth())              * comp.getAlignmentX() + insets.left);            comp.setLocation(cx, y);            y = y + height;                      }      }      }