How to fill GridLayout from top to bottom and then from left to right?

The default behavior of a GridLayout is that components are filled row by row, and from left to right. I wonder if I can use it so that the components are filled with columns (from left to right)? Thanks.

+4
source share
4 answers

You can extend GridLayout and override only one method instead of int i = r * ncols + c; use int i = c * nrows + r; I think that is enough.

 public void layoutContainer(Container parent) { synchronized (parent.getTreeLock()) { Insets insets = parent.getInsets(); int ncomponents = parent.getComponentCount(); int nrows = rows; int ncols = cols; boolean ltr = parent.getComponentOrientation().isLeftToRight(); if (ncomponents == 0) { return; } if (nrows > 0) { ncols = (ncomponents + nrows - 1) / nrows; } else { nrows = (ncomponents + ncols - 1) / ncols; } int w = parent.width - (insets.left + insets.right); int h = parent.height - (insets.top + insets.bottom); w = (w - (ncols - 1) * hgap) / ncols; h = (h - (nrows - 1) * vgap) / nrows; if (ltr) { for (int c = 0, x = insets.left ; c < ncols ; c++, x += w + hgap) { for (int r = 0, y = insets.top ; r < nrows ; r++, y += h + vgap) { int i = r * ncols + c; if (i < ncomponents) { parent.getComponent(i).setBounds(x, y, w, h); } } } } else { for (int c = 0, x = parent.width - insets.right - w; c < ncols ; c++, x -= w + hgap) { for (int r = 0, y = insets.top ; r < nrows ; r++, y += h + vgap) { int i = r * ncols + c; if (i < ncomponents) { parent.getComponent(i).setBounds(x, y, w, h); } } } } } } 
+5
source

This usage example is not supported by the GridLayout manager.

I suggest you instead of GridBagLayout , which allows you to set the location through GridBagConstraints.gridx and GridBagConstraints.gridy .

(To get a behavior like GridLayout , be sure to set the scales and fill in correctly.)

+5
source

You cannot achieve this with a single GridLayout . However, you could have a GridLayout one row so that each cell has a GridLayout one column with multiple rows. Although using another LayoutManager, such as TableLayout , might be easier.

+2
source

I suggest you try MigLayout . You can switch the flow direction with:

 setLayout(new MigLayout("flowy")); add(component1); add(component2); add(component3, "wrap"); add(component4); add(component5); add(component6); 

There are many ways to achieve this with MigLayout, and I find it more usable than GridBagLayout, and just as capable, if not more so. You will no longer need BorderLayout, FlowLayout, BoxLayout, etc., MigLayout does this too.

+1
source

All Articles