Exemple #1
0
  /**
   * Aligns the first <code>rows</code> * <code>cols</code> components of <code>parent</code> in a
   * grid. Each component in a column is as wide as the maximum preferred width of the components in
   * that column; height is similarly determined for each row. The parent is made just big enough to
   * fit them all.
   *
   * @param rows number of rows
   * @param cols number of columns
   * @param initialX x location to start the grid at
   * @param initialY y location to start the grid at
   * @param xPad x padding between cells
   * @param yPad y padding between cells
   */
  public static void makeCompactGrid(
      Container parent, int rows, int cols, int initialX, int initialY, int xPad, int yPad) {
    SpringLayout layout;
    try {
      layout = (SpringLayout) parent.getLayout();
    } catch (ClassCastException exc) {
      System.err.println("The first argument to makeCompactGrid must use SpringLayout.");
      return;
    }

    // Align all cells in each column and make them the same width.
    Spring x = Spring.constant(initialX);
    for (int c = 0; c < cols; c++) {
      Spring width = Spring.constant(0);
      for (int r = 0; r < rows; r++) {
        width =
            Spring.max(width, SpringUtilities.getConstraintsForCell(r, c, parent, cols).getWidth());
      }
      for (int r = 0; r < rows; r++) {
        SpringLayout.Constraints constraints =
            SpringUtilities.getConstraintsForCell(r, c, parent, cols);
        constraints.setX(x);
        constraints.setWidth(width);
      }
      x = Spring.sum(x, Spring.sum(width, Spring.constant(xPad)));
    }

    // Align all cells in each row and make them the same height.
    Spring y = Spring.constant(initialY);
    for (int r = 0; r < rows; r++) {
      Spring height = Spring.constant(0);
      for (int c = 0; c < cols; c++) {
        height =
            Spring.max(
                height, SpringUtilities.getConstraintsForCell(r, c, parent, cols).getHeight());
      }
      for (int c = 0; c < cols; c++) {
        SpringLayout.Constraints constraints =
            SpringUtilities.getConstraintsForCell(r, c, parent, cols);
        constraints.setY(y);
        constraints.setHeight(height);
      }
      y = Spring.sum(y, Spring.sum(height, Spring.constant(yPad)));
    }

    // Set the parent's size.
    SpringLayout.Constraints pCons = layout.getConstraints(parent);
    pCons.setConstraint(SpringLayout.SOUTH, y);
    pCons.setConstraint(SpringLayout.EAST, x);
  }
 /**
  * Aligns the height of all cells in a row.
  *
  * @param layout
  * @param grid
  * @param cols
  * @param rows
  * @return
  */
 private Spring alignRows(SpringLayout layout, List<List<Component>> grid, int cols, int rows) {
   // Align all cells in each row and make them the same height.
   Spring y = Spring.constant(this.topMargin);
   int[] rowSpacing = new int[rows];
   Arrays.fill(rowSpacing, this.yPad);
   // no space above filler line
   rowSpacing[rows - 2] = 0;
   rowSpacing[rows - 1] = this.bottomMargin;
   for (int r = 0; r < rows; r++) {
     Spring height = Spring.constant(0);
     for (int c = 0; c < cols; c++)
       if (grid.get(r).get(c) != null)
         height = Spring.max(height, layout.getConstraints(grid.get(r).get(c)).getHeight());
     for (int c = 0; c < cols; c++)
       if (grid.get(r).get(c) != null) {
         SpringLayout.Constraints constraints = layout.getConstraints(grid.get(r).get(c));
         constraints.setY(y);
         constraints.setHeight(height);
       }
     y = Spring.sum(y, Spring.sum(height, Spring.constant(rowSpacing[r])));
   }
   return y;
 }
  public void beautify(Container panel) {
    SpringLayout layout = new SpringLayout();
    Map<Component, Boolean> spanToRight = new IdentityHashMap<>();
    List<List<Component>> grid = extractGrid(panel, spanToRight);

    int cols = 1;
    for (List<Component> row : grid) cols = Math.max(cols, row.size());

    // add empty stretchable line
    List<Component> lastRow = new ArrayList<>();
    for (int index = 0; index < cols; index++) lastRow.add(Box.createVerticalGlue());
    grid.add(lastRow);
    int rows = grid.size();

    Map<Component, int[]> spannedComponents = findSpannedComponents(spanToRight, grid, cols);

    readdComponents(panel, grid);
    panel.setLayout(layout);

    Spring x = alignColumns(layout, grid, cols, rows, spannedComponents);

    Spring y = alignRows(layout, grid, cols, rows);

    // Set the parent's size.
    SpringLayout.Constraints pCons = layout.getConstraints(panel);
    pCons.setConstraint(SpringLayout.SOUTH, y);
    pCons.setConstraint(SpringLayout.EAST, x);

    // if(rows == 2) {
    // // SpringUtilities.makeCompactGrid(panel, rows, cols, leftMargin, topMargin, xPad, yPad);
    // x = alignColumns(layout, grid, cols, rows, spannedComponents);
    // y = alignRows(layout, grid, cols, rows);
    // pCons.setConstraint(SpringLayout.SOUTH, y);
    // pCons.setConstraint(SpringLayout.EAST, x);
    // }
  }
  /**
   * Aligns the widths of all columns and handles the spanned components.
   *
   * @param layout
   * @param grid
   * @param cols
   * @param rows
   * @param spannedComponents
   * @return
   */
  private Spring alignColumns(
      SpringLayout layout,
      List<List<Component>> grid,
      int cols,
      int rows,
      Map<Component, int[]> spannedComponents) {
    // Align all cells in each column and make them the same width.
    Spring x = Spring.constant(this.leftMargin);
    Spring[] colWidths = new Spring[cols], colXs = new Spring[cols];
    for (int c = 0; c < cols; c++) {
      colXs[c] = x;
      colWidths[c] = Spring.constant(0);
      for (int r = 0; r < rows; r++) {
        final Component cell = grid.get(r).get(c);
        if (cell != null && !spannedComponents.containsKey(cell))
          colWidths[c] = Spring.max(colWidths[c], layout.getConstraints(cell).getWidth());
      }

      for (int r = 0; r < rows; r++) {
        final Component cell = grid.get(r).get(c);
        if (cell != null && !spannedComponents.containsKey(cell)) {
          SpringLayout.Constraints constraints = layout.getConstraints(grid.get(r).get(c));
          constraints.setX(x);
          constraints.setWidth(colWidths[c]);
        }
      }
      x =
          Spring.sum(
              x,
              Spring.sum(
                  colWidths[c], Spring.constant(c == cols - 1 ? this.rightMargin : this.xPad)));
    }
    for (Entry<Component, int[]> spans : spannedComponents.entrySet()) {
      SpringLayout.Constraints constraints = layout.getConstraints(spans.getKey());
      final int[] colRange = spans.getValue();
      constraints.setX(colXs[colRange[0]]);
      Spring width = colWidths[colRange[0]];
      for (int col = colRange[0] + 1; col <= colRange[1]; col++)
        width = Spring.sum(Spring.sum(width, colWidths[col]), Spring.constant(this.xPad));
      constraints.setWidth(width);
    }
    return x;
  }
  /**
   * Aligns the first <code>rows</code> * <code>cols</code> components of <code>parent</code> in a
   * grid. Each component is as big as the maximum preferred width and height of the components. The
   * parent is made just big enough to fit them all.
   *
   * @param rows number of rows
   * @param cols number of columns
   * @param initialX x location to start the grid at
   * @param initialY y location to start the grid at
   * @param xPad x padding between cells
   * @param yPad y padding between cells
   */
  public static void makeGrid(
      Container parent, int rows, int cols, int initialX, int initialY, int xPad, int yPad) {
    SpringLayout layout;
    try {
      layout = (SpringLayout) parent.getLayout();
    } catch (ClassCastException exc) {
      System.err.println("The first argument to makeGrid must use SpringLayout.");
      return;
    }

    Spring xPadSpring = Spring.constant(xPad);
    Spring yPadSpring = Spring.constant(yPad);
    Spring initialXSpring = Spring.constant(initialX);
    Spring initialYSpring = Spring.constant(initialY);
    int max = rows * cols;

    // Calculate Springs that are the max of the width/height so that all
    // cells have the same size.
    Spring maxWidthSpring = layout.getConstraints(parent.getComponent(0)).getWidth();
    Spring maxHeightSpring = layout.getConstraints(parent.getComponent(0)).getWidth();
    for (int i = 1; i < max; i++) {
      SpringLayout.Constraints cons = layout.getConstraints(parent.getComponent(i));

      maxWidthSpring = Spring.max(maxWidthSpring, cons.getWidth());
      maxHeightSpring = Spring.max(maxHeightSpring, cons.getHeight());
    }

    // Apply the new width/height Spring. This forces all the
    // components to have the same size.
    for (int i = 0; i < max; i++) {
      SpringLayout.Constraints cons = layout.getConstraints(parent.getComponent(i));

      cons.setWidth(maxWidthSpring);
      cons.setHeight(maxHeightSpring);
    }

    // Then adjust the x/y constraints of all the cells so that they
    // are aligned in a grid.
    SpringLayout.Constraints lastCons = null;
    SpringLayout.Constraints lastRowCons = null;
    for (int i = 0; i < max; i++) {
      SpringLayout.Constraints cons = layout.getConstraints(parent.getComponent(i));
      if (i % cols == 0) { // start of new row
        lastRowCons = lastCons;
        cons.setX(initialXSpring);
      } else { // x position depends on previous component
        cons.setX(Spring.sum(lastCons.getConstraint(SpringLayout.EAST), xPadSpring));
      }

      if (i / cols == 0) { // first row
        cons.setY(initialYSpring);
      } else { // y position depends on previous row
        cons.setY(Spring.sum(lastRowCons.getConstraint(SpringLayout.SOUTH), yPadSpring));
      }
      lastCons = cons;
    }

    // Set the parent's size.
    SpringLayout.Constraints pCons = layout.getConstraints(parent);
    pCons.setConstraint(
        SpringLayout.SOUTH,
        Spring.sum(Spring.constant(yPad), lastCons.getConstraint(SpringLayout.SOUTH)));
    pCons.setConstraint(
        SpringLayout.EAST,
        Spring.sum(Spring.constant(xPad), lastCons.getConstraint(SpringLayout.EAST)));
  }
  public static void makeGrid(
      Container parent, int rows, int cols, int initialX, int initialY, int xPad, int yPad) {
    SpringLayout layout;
    try {
      layout = (SpringLayout) parent.getLayout();
    } catch (ClassCastException exc) {
      System.err.println("The first argument to makeGrid must use SpringLayout.");
      return;
    }

    Spring xPadSpring = Spring.constant(xPad);
    Spring yPadSpring = Spring.constant(yPad);
    Spring initialXSpring = Spring.constant(initialX);
    Spring initialYSpring = Spring.constant(initialY);
    int max = rows * cols;

    Spring maxWidthSpring = layout.getConstraints(parent.getComponent(0)).getWidth();
    Spring maxHeightSpring = layout.getConstraints(parent.getComponent(0)).getWidth();
    for (int i = 1; i < max; i++) {
      SpringLayout.Constraints cons = layout.getConstraints(parent.getComponent(i));
      maxWidthSpring = Spring.max(maxWidthSpring, cons.getWidth());
      maxHeightSpring = Spring.max(maxHeightSpring, cons.getHeight());
    }

    for (int i = 0; i < max; i++) {
      SpringLayout.Constraints cons = layout.getConstraints(parent.getComponent(i));
      cons.setWidth(maxWidthSpring);
      cons.setHeight(maxHeightSpring);
    }

    SpringLayout.Constraints lastCons = null;
    SpringLayout.Constraints lastRowCons = null;
    for (int i = 0; i < max; i++) {
      SpringLayout.Constraints cons = layout.getConstraints(parent.getComponent(i));
      if (i % cols == 0) {
        lastRowCons = lastCons;
        cons.setX(initialXSpring);
      } else {
        cons.setX(Spring.sum(lastCons.getConstraint(SpringLayout.EAST), xPadSpring));
      }

      if (i / cols == 0) {
        cons.setY(initialYSpring);
      } else {
        cons.setY(Spring.sum(lastRowCons.getConstraint(SpringLayout.SOUTH), yPadSpring));
      }
      lastCons = cons;
    }

    SpringLayout.Constraints pCons = layout.getConstraints(parent);
    pCons.setConstraint(
        SpringLayout.SOUTH,
        Spring.sum(Spring.constant(yPad), lastCons.getConstraint(SpringLayout.SOUTH)));
    pCons.setConstraint(
        SpringLayout.EAST,
        Spring.sum(Spring.constant(xPad), lastCons.getConstraint(SpringLayout.EAST)));
  }