!7 abstract sclass AbstractLayoutManager implements LayoutManager { Dimension preferredSize = new Dimension(100, 100); bool invalidate; public void addLayoutComponent(String name, Component comp) { print("addLayoutComponent called"); } public void removeLayoutComponent(Component comp) { print("removeLayoutComponent called"); } public Dimension preferredLayoutSize(Container parent) { print("preferredLayoutSize called (" + invalidate + ")"); layoutContainer(parent); //validate(parent); ret preferredSize; } public Dimension minimumLayoutSize(Container parent) { print("minimumLayoutSize called"); ret new Dimension(10, 10); } void validate(Container parent) { if (invalidate) { invalidate = false; layoutContainer(parent); } } } p-substance { JPanel panel = new JPanel(new AbstractLayoutManager { public void layoutContainer(Container parent) { print("layoutContainer called"); int y = 10; for (Component c : parent.getComponents()) { int h = c.getPreferredSize().height; c.setBounds(10, y, 300, h); y += h + 10; } preferredSize = componentsBoundingSize(parent, 10); } }); for i to 10: panel.add(jtextfield()); print("components added"); showFrame(jscroll_centered(panel)); }