!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) { Dimension size = parent.getSize(); print("layoutContainer called, size=" + size); int y = 10; for (Component c : parent.getComponents()) { int h = c.getPreferredSize().height; c.setBounds(10, y, size.width-20, h); y += h + 10; } preferredSize = componentsBoundingSize(parent, 10); } }); for i to 10: panel.add(jtextfield()); print("components added"); showFrame(panel); }