sclass JG22Network is Swingable { G22Utils g22utils; 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); if (r == null) r = rect(0, 0, 0, 0); //_print("JG22Network.getPreferredSize = " + r); ret new Dimension(r.x2()+margin, r.y2()+margin); } void revalidateMe() { //_print("JG22Network.revalidateMe"); //awtLater(0.5, -> { revalidateIncludingFullCenterContainer(this); repaint(); //}); } } *(G22Utils *g22utils, G22Network *network) { for (element : network.elements) visualizeElement(element); } void visualizeElement(G22NetworkElement element) swing { mainPanel.add(new JG22NetworkElement(g22utils, 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*/jscroll(mainPanel), "New element", rThread newElement); }