--- old/src/share/classes/sun/swing/JLightweightFrame.java 2013-07-19 16:01:52.000000000 +0400 +++ new/src/share/classes/sun/swing/JLightweightFrame.java 2013-07-19 16:01:51.000000000 +0400 @@ -29,12 +29,20 @@ import java.awt.Color; import java.awt.Component; import java.awt.Container; +import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; +import java.awt.event.ComponentEvent; +import java.awt.event.ComponentListener; +import java.awt.event.ContainerAdapter; +import java.awt.event.ContainerEvent; +import java.awt.event.ContainerListener; import java.awt.image.BufferedImage; import java.awt.image.DataBufferInt; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import java.security.AccessController; import javax.swing.JLayeredPane; @@ -79,6 +87,8 @@ */ private boolean copyBufferEnabled; private int[] copyBuffer; + + private PropertyChangeListener layoutSizeListener; /** * Constructs a new, initially invisible {@code JLightweightFrame} @@ -104,10 +114,42 @@ * * @param content the {@link LightweightContent} instance */ - public void setContent(LightweightContent content) { + public void setContent(final LightweightContent content) { + if (content == null) { + System.err.println("JLightweightFrame.setContent: content may not be null!"); + return; + } this.content = content; this.component = content.getComponent(); + layoutSizeListener = new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent e) { + Dimension d = (Dimension)e.getNewValue(); + + if ("preferredSize".equals(e.getPropertyName())) { + content.preferredSizeChanged(d.width, d.height); + + } else if ("maximumSize".equals(e.getPropertyName())) { + content.maximumSizeChanged(d.width, d.height); + + } else if ("minimumSize".equals(e.getPropertyName())) { + content.minimumSizeChanged(d.width, d.height); + } + } + }; + this.component.addPropertyChangeListener("preferredSize", layoutSizeListener); + Dimension d = this.component.getPreferredSize(); + content.preferredSizeChanged(d.width, d.height); + + this.component.addPropertyChangeListener("maximumSize", layoutSizeListener); + d = this.component.getMaximumSize(); + content.maximumSizeChanged(d.width, d.height); + + this.component.addPropertyChangeListener("minimumSize", layoutSizeListener); + d = this.component.getMinimumSize(); + content.minimumSizeChanged(d.width, d.height); + initInterior(); } @@ -202,6 +244,16 @@ contentPane.setLayout(new BorderLayout()); contentPane.add(component); setContentPane(contentPane); + + contentPane.addContainerListener(new ContainerAdapter() { + @Override + public void componentRemoved(ContainerEvent e) { + Component c = JLightweightFrame.this.component; + if (e.getChild() == c) { + c.removePropertyChangeListener(layoutSizeListener); + } + } + }); } @SuppressWarnings("deprecation")