// TODO: all the fringe cases (?) static JPanel hvgrid(L> components) { if (empty(components)) ret new JPanel; int h = l(components), w = l(first(components)); new JPanel panel; panel.setLayout(new GridLayout(h, w)); for (L row : components) smartAdd(panel, row); ret panel; } static JPanel hvgrid(L> components, int gap) { JPanel panel = hvgrid(components); GridLayout g = cast panel.getLayout(); g.setHgap(gap); g.setVgap(gap); ret panel; }