diff --git a/src/share/classes/sun/swing/JLightweightFrame.java b/src/share/classes/sun/swing/JLightweightFrame.java index a9ac4371cc131c4c0b35e2616507d9f339e38ab7..36bb1c351b76f56c2b256c7b37e9dfae67e16b2c 100644 --- a/src/share/classes/sun/swing/JLightweightFrame.java +++ b/src/share/classes/sun/swing/JLightweightFrame.java @@ -29,12 +29,18 @@ import java.awt.BorderLayout; 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.ComponentListener; +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; @@ -80,6 +86,8 @@ public final class JLightweightFrame extends LightweightFrame implements RootPan private boolean copyBufferEnabled; private int[] copyBuffer; + private PropertyChangeListener layoutSizeListener; + /** * Constructs a new, initially invisible {@code JLightweightFrame} * instance. @@ -94,6 +102,23 @@ public final class JLightweightFrame extends LightweightFrame implements RootPan if (getGraphicsConfiguration().isTranslucencyCapable()) { setBackground(new Color(0, 0, 0, 0)); } + + 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); + } + } + }; } /** @@ -104,10 +129,23 @@ public final class JLightweightFrame extends LightweightFrame implements RootPan * * @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(); + Dimension d = this.component.getPreferredSize(); + content.preferredSizeChanged(d.width, d.height); + + d = this.component.getMaximumSize(); + content.maximumSizeChanged(d.width, d.height); + + d = this.component.getMinimumSize(); + content.minimumSizeChanged(d.width, d.height); + initInterior(); } @@ -202,6 +240,25 @@ public final class JLightweightFrame extends LightweightFrame implements RootPan contentPane.setLayout(new BorderLayout()); contentPane.add(component); setContentPane(contentPane); + + contentPane.addContainerListener(new ContainerListener() { + @Override + public void componentAdded(ContainerEvent e) { + Component c = JLightweightFrame.this.component; + if (e.getChild() == c) { + c.addPropertyChangeListener("preferredSize", layoutSizeListener); + c.addPropertyChangeListener("maximumSize", layoutSizeListener); + c.addPropertyChangeListener("minimumSize", layoutSizeListener); + } + } + @Override + public void componentRemoved(ContainerEvent e) { + Component c = JLightweightFrame.this.component; + if (e.getChild() == c) { + c.removePropertyChangeListener(layoutSizeListener); + } + } + }); } @SuppressWarnings("deprecation") diff --git a/src/share/classes/sun/swing/LightweightContent.java b/src/share/classes/sun/swing/LightweightContent.java index 2d443fba23ce1de9f9765df0b6727a56b6c4916e..256262dded1ffa1ac1902e9b99cab4625e695cbc 100644 --- a/src/share/classes/sun/swing/LightweightContent.java +++ b/src/share/classes/sun/swing/LightweightContent.java @@ -161,4 +161,22 @@ public interface LightweightContent { * application that the frame has ungrabbed focus. */ public void focusUngrabbed(); + + /** + * {@code JLightweightFrame} calls this method to notify the client + * application that the content preferred size has changed. + */ + public void preferredSizeChanged(int width, int height); + + /** + * {@code JLightweightFrame} calls this method to notify the client + * application that the content maximum size has changed. + */ + public void maximumSizeChanged(int width, int height); + + /** + * {@code JLightweightFrame} calls this method to notify the client + * application that the content minimum size has changed. + */ + public void minimumSizeChanged(int width, int height); }