//please include function withMargin. static int showForm_defaultGap = 4; static int showForm_gapBetweenColumns = 10; static JPanel showFormTitled(fS title, fO... _parts) { ret swing(func -> JPanel { final new Var frame; JPanel panel = showForm_makePanel(frame, _parts); frame.set(handleEscapeKey(minFrameWidth(showPackedFrame(title, withMargin(panel)), 400))); ret panel; }); } static JPanel showForm_makePanel(final Var frame, O... _parts) { new LL l; L parts = asList(_parts); Runnable submit = null; for (int i = 0; i < l(parts); i++) { final O o = parts.get(i), next = get(parts, i+1); if (o instanceof Component || o instanceof S || next instanceof Component) { // smartAdd accepts strings l.add(mapLL wrapForSmartAdd(o == null ? new JPanel : o, next)); if (next instanceof JButton && submit == null) submit = r { ((JButton) next).doClick() }; i++; } else if (isRunnable(o)) l.add(mapLL wrapForSmartAdd(null, jbutton(showFormSubmitButtonName(), submit = r { O result = call(o); if (neq(Boolean.FALSE, result)) disposeFrame(frame.get()); }))); else print("showForm: Unknown element type: " + getClassName(o)); } int minW = 0; for (L row : l) minW = max(minW, getMinimumSize(first(row)).width); new L out; for (L row : l) { JComponent left = first(row); if (left instanceof JLabel) ((JLabel) left).setVerticalAlignment(JLabel.TOP); out.add(westAndCenter(withRightMargin(showForm_gapBetweenColumns, jMinWidth(minW, left)), second(row))); } JPanel panel = vstackWithSpacing(out, showForm_defaultGap); if (submit != null) for (JTextField textField : childrenOfType(panel, JTextField.class)) onEnter(textField, submit); ret panel; }