//please include function withMargin.

static int showForm_defaultGap = 4;

static JPanel showFormTitled(fS title, fO... _parts) {
  ret swing(func -> JPanel {
    final new Var<JFrame> frame;
    JPanel panel = showForm_makePanel(frame, _parts);
    frame.set(handleEscapeKey(minFrameWidth(showPackedFrame(title, withMargin(panel)), 400)));
    ret panel;
  });
}

static JPanel showForm_makePanel(final Var<JFrame> frame, O... _parts) {
  new L<L> 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(ll(o == null ? new JPanel : o, next));
      if (next instanceof JButton && submit == null)
        submit = r { ((JButton) next).doClick() };
      i++;
    } else if (isRunnable(o))
      l.add(ll(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));
  }
  JPanel panel = hvgrid((L) l, showForm_defaultGap);
  if (submit != null)
    for (JTextField textField : childrenOfType(panel, JTextField.class))
      onEnter(textField, submit);
  ret panel;
}