concept JG22Network is Swingable { JPanel panel = jpanelWithoutLayoutManager(); new G22Network network; *(G22Network *network) { for (element : network.elements) visualizeElement(element); } void visualizeElement(G22NetworkElement element) { var box = jMinSize(400, 300, jcenteredlabel("Drag or resize me!")); setOpaqueBackground(Color.white, box); setBorder(box, BorderFactory.createLineBorder(Color.green, 10); onMouseDown(box, event -> { if (!mouseEventIsInBorder(event)) new ComponentDragger(box, event); }); new ComponentResizeDragger(box, box); var bounds = or(element.bounds, rect(50, 50, 400, 300)); setBounds(box, bounds); addToContainer(panel, box); } void newElement { new G22NetworkElement element; network.elements.add(element); network.change(); visualizeElement(element); } cachedVisual panel; }