concept JG22Network is Swingable { new MainPanel mainPanel; new G22Network network; // margin on bottom/right transient int margin = 50; class MainPanel extends JPanel { *() { super(null); } // no layout manager public Dimension getPreferredSize() { Rect r = combinedChildBounds(this); print("JG22Network.getPreferredSize = " + r); ret new Dimension(r.x2()+margin, r.y2()+margin); } void revalidateMe() { print("JG22Network.revalidateMe"); awtLater(0.5, -> { revalidateIncludingFullCenterContainer(this); repaint(); }); } } *(G22Network *network) { for (element : network.elements) visualizeElement(element); } void visualizeElement(G22NetworkElement element) swing { mainPanel.add(new JG22NetworkElement(this, element).visualize()); mainPanel.revalidateMe(); } void newElement { new G22NetworkElement element; element.network(network); network.elements.add(element); network.change(); visualizeElement(element); } cachedVisual withRightAlignedButtons(jscroll_center_borderless(mainPanel), "New element", rThread newElement); }