JPanel size by inner components

After looking at the source code for pack(), I came up with:

    panel.setPreferredSize(panel.getPreferredSize());

This forces the panel to recalculate its preferred size based on the preferred sizes of its subcomponenents.

You may or may not have to call validate() afterward; in my tiny example, it seemed to make no difference, but the Javadoc says:

The validate method is used to cause a container to lay out its subcomponents again. It should be invoked when this container's subcomponents are modified (added to or removed from the container, or layout-related information changed) after the container has been displayed.

So I guess it depends on why you're having to repack your JPanel.


By default Containers have a preferred size that matches the preferred layout size given by the container. So literally all you have to do is:

panel.setSize(panel.getPreferredSize());

Presumably you are doing something odd with the parent to stop the parent's layout manager doing the equivalent of this.