// Don't call add/remove directly - use addComponent/removeComponent static abstract class DynamicStack extends JPanel { settable int spacing = 10; bool useFiller; *() { this(true); } *(bool useFiller) { super(new GridBagLayout); this.useFiller = useFiller; _addFiller(); } abstract GridBagConstraints _componentConstraints(); abstract GridBagConstraints _fillerConstraints(); void _addFiller { if (useFiller) add(jrigid(), _fillerConstraints()); } void addComponent(final Component c) { addComponents(ll(c)); } void addComponents(Cl l) swing { fOr (Component c : l) if (c.getParent() != this) add(c, _componentConstraints(), getComponentCount()-(useFiller ? 1 : 0)); revalidate(); } void setComponents(Cl l) { removeAll(); _addFiller(); addComponents(l); } void clearComponents() { setComponents(null); } void removeComponent(Component c) swing { if (c != null) { remove(c); revalidate(); } } int numComponents() { ret countComponents()-1; } L components() { ret dropLast(main getComponents(this)); } bool isEmpty() { ret numComponents() == 0; } }