diff --git a/jdk/src/share/classes/javax/swing/JEditorPane.java b/jdk/src/share/classes/javax/swing/JEditorPane.java index eaf61f1e60e..acd825c1d96 100644 --- a/jdk/src/share/classes/javax/swing/JEditorPane.java +++ b/jdk/src/share/classes/javax/swing/JEditorPane.java @@ -1330,8 +1330,9 @@ public class JEditorPane extends JTextComponent { */ public Dimension getPreferredSize() { Dimension d = super.getPreferredSize(); - JViewport port = SwingUtilities.getParentViewport(this); - if (port != null) { + Container parent = SwingUtilities.getUnwrappedParent(this); + if (parent instanceof JViewport) { + JViewport port = (JViewport) parent; TextUI ui = getUI(); int prefWidth = d.width; int prefHeight = d.height; @@ -1452,8 +1453,9 @@ public class JEditorPane extends JTextComponent { * match its own, false otherwise */ public boolean getScrollableTracksViewportWidth() { - JViewport port = SwingUtilities.getParentViewport(this); - if (port != null) { + Container parent = SwingUtilities.getUnwrappedParent(this); + if (parent instanceof JViewport) { + JViewport port = (JViewport) parent; TextUI ui = getUI(); int w = port.getWidth(); Dimension min = ui.getMinimumSize(this); @@ -1474,8 +1476,9 @@ public class JEditorPane extends JTextComponent { * false otherwise */ public boolean getScrollableTracksViewportHeight() { - JViewport port = SwingUtilities.getParentViewport(this); - if (port != null) { + Container parent = SwingUtilities.getUnwrappedParent(this); + if (parent instanceof JViewport) { + JViewport port = (JViewport) parent; TextUI ui = getUI(); int h = port.getHeight(); Dimension min = ui.getMinimumSize(this); diff --git a/jdk/src/share/classes/javax/swing/JList.java b/jdk/src/share/classes/javax/swing/JList.java index 8a86bda547d..10aa3adf93d 100644 --- a/jdk/src/share/classes/javax/swing/JList.java +++ b/jdk/src/share/classes/javax/swing/JList.java @@ -25,17 +25,7 @@ package javax.swing; -import java.awt.Color; -import java.awt.Component; -import java.awt.Cursor; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.GraphicsEnvironment; -import java.awt.HeadlessException; -import java.awt.Insets; -import java.awt.Point; -import java.awt.Rectangle; +import java.awt.*; import java.awt.event.*; import java.util.Vector; @@ -2779,9 +2769,9 @@ public class JList extends JComponent implements Scrollable, Accessible getVisibleRowCount() <= 0) { return true; } - JViewport port = SwingUtilities.getParentViewport(this); - if (port != null) { - return port.getWidth() > getPreferredSize().width; + Container parent = SwingUtilities.getUnwrappedParent(this); + if (parent instanceof JViewport) { + return parent.getWidth() > getPreferredSize().width; } return false; } @@ -2805,9 +2795,9 @@ public class JList extends JComponent implements Scrollable, Accessible getVisibleRowCount() <= 0) { return true; } - JViewport port = SwingUtilities.getParentViewport(this); - if (port != null) { - return port.getHeight() > getPreferredSize().height; + Container parent = SwingUtilities.getUnwrappedParent(this); + if (parent instanceof JViewport) { + return parent.getHeight() > getPreferredSize().height; } return false; } diff --git a/jdk/src/share/classes/javax/swing/JTable.java b/jdk/src/share/classes/javax/swing/JTable.java index 236e59102c1..09157ca93f8 100644 --- a/jdk/src/share/classes/javax/swing/JTable.java +++ b/jdk/src/share/classes/javax/swing/JTable.java @@ -719,8 +719,9 @@ public class JTable extends JComponent implements TableModelListener, Scrollable * @see #addNotify */ protected void configureEnclosingScrollPane() { - JViewport port = SwingUtilities.getParentViewport(this); - if (port != null) { + Container parent = SwingUtilities.getUnwrappedParent(this); + if (parent instanceof JViewport) { + JViewport port = (JViewport) parent; Container gp = port.getParent(); if (gp instanceof JScrollPane) { JScrollPane scrollPane = (JScrollPane)gp; @@ -752,8 +753,9 @@ public class JTable extends JComponent implements TableModelListener, Scrollable * from configureEnclosingScrollPane() and updateUI() in a safe manor. */ private void configureEnclosingScrollPaneUI() { - JViewport port = SwingUtilities.getParentViewport(this); - if (port != null) { + Container parent = SwingUtilities.getUnwrappedParent(this); + if (parent instanceof JViewport) { + JViewport port = (JViewport) parent; Container gp = port.getParent(); if (gp instanceof JScrollPane) { JScrollPane scrollPane = (JScrollPane)gp; @@ -822,8 +824,9 @@ public class JTable extends JComponent implements TableModelListener, Scrollable * @since 1.3 */ protected void unconfigureEnclosingScrollPane() { - JViewport port = SwingUtilities.getParentViewport(this); - if (port != null) { + Container parent = SwingUtilities.getUnwrappedParent(this); + if (parent instanceof JViewport) { + JViewport port = (JViewport) parent; Container gp = port.getParent(); if (gp instanceof JScrollPane) { JScrollPane scrollPane = (JScrollPane)gp; @@ -5217,10 +5220,10 @@ public class JTable extends JComponent implements TableModelListener, Scrollable * @see #getFillsViewportHeight */ public boolean getScrollableTracksViewportHeight() { - JViewport port = SwingUtilities.getParentViewport(this); + Container parent = SwingUtilities.getUnwrappedParent(this); return getFillsViewportHeight() - && port != null - && port.getHeight() > getPreferredSize().height; + && parent instanceof JViewport + && parent.getHeight() > getPreferredSize().height; } /** diff --git a/jdk/src/share/classes/javax/swing/JTextField.java b/jdk/src/share/classes/javax/swing/JTextField.java index 24a3408d1b4..e1e6b640c65 100644 --- a/jdk/src/share/classes/javax/swing/JTextField.java +++ b/jdk/src/share/classes/javax/swing/JTextField.java @@ -292,7 +292,7 @@ public class JTextField extends JTextComponent implements SwingConstants { */ @Override public boolean isValidateRoot() { - return SwingUtilities.getParentViewport(this) == null; + return !(SwingUtilities.getUnwrappedParent(this) instanceof JViewport); } diff --git a/jdk/src/share/classes/javax/swing/JTree.java b/jdk/src/share/classes/javax/swing/JTree.java index 55815b81dc2..788aeab1fc1 100644 --- a/jdk/src/share/classes/javax/swing/JTree.java +++ b/jdk/src/share/classes/javax/swing/JTree.java @@ -3498,9 +3498,9 @@ public class JTree extends JComponent implements Scrollable, Accessible * @see Scrollable#getScrollableTracksViewportWidth */ public boolean getScrollableTracksViewportWidth() { - JViewport port = SwingUtilities.getParentViewport(this); - if (port != null) { - return port.getWidth() > getPreferredSize().width; + Container parent = SwingUtilities.getUnwrappedParent(this); + if (parent instanceof JViewport) { + return parent.getWidth() > getPreferredSize().width; } return false; } @@ -3515,9 +3515,9 @@ public class JTree extends JComponent implements Scrollable, Accessible * @see Scrollable#getScrollableTracksViewportHeight */ public boolean getScrollableTracksViewportHeight() { - JViewport port = SwingUtilities.getParentViewport(this); - if (port != null) { - return port.getHeight() > getPreferredSize().height; + Container parent = SwingUtilities.getUnwrappedParent(this); + if (parent instanceof JViewport) { + return parent.getHeight() > getPreferredSize().height; } return false; } diff --git a/jdk/src/share/classes/javax/swing/SwingUtilities.java b/jdk/src/share/classes/javax/swing/SwingUtilities.java index 1221c4bce74..65b267eb8f3 100644 --- a/jdk/src/share/classes/javax/swing/SwingUtilities.java +++ b/jdk/src/share/classes/javax/swing/SwingUtilities.java @@ -1969,58 +1969,53 @@ public class SwingUtilities implements SwingConstants } /** - * Looks for the first ancestor of the {@code component} + * Returns the first ancestor of the {@code component} * which is not an instance of {@link JLayer}. - * If this ancestor is an instance of {@code JViewport}, - * this {@code JViewport} is returned, otherwise returns {@code null}. - * The following way of obtaining the parent {@code JViewport} - * is not recommended any more: - *
-     * JViewport port = null;
-     * Container parent = component.getParent();
-     * // not recommended any more
-     * if(parent instanceof JViewport) {
-     *     port = (JViewport) parent;
-     * }
-     * 
- * Here is the way to go: - *
-     * // the correct way:
-     * JViewport port = SwingUtilities.getParentViewport(component);
-     * 
- * @param component {@code Component} to get the parent {@code JViewport} of. - * @return the {@code JViewport} instance for the {@code component} - * or {@code null} + * + * @param component {@code Component} to get + * the first ancestor of, which is not a {@link JLayer} instance. + * + * @return the first ancestor of the {@code component} + * which is not an instance of {@link JLayer}. + * If such an ancestor can not be found, {@code null} is returned. + * * @throws NullPointerException if {@code component} is {@code null} + * @see JLayer * * @since 1.7 */ - public static JViewport getParentViewport(Component component) { - do { - component = component.getParent(); - if (component instanceof JViewport) { - return (JViewport) component; - } - } while(component instanceof JLayer); - return null; + public static Container getUnwrappedParent(Component component) { + Container parent = component.getParent(); + while(parent instanceof JLayer) { + parent = parent.getParent(); + } + return parent; } /** * Returns the first {@code JViewport}'s descendant - * which is not an instance of {@code JLayer} or {@code null}. + * which is not an instance of {@code JLayer}. + * If such a descendant can not be found, {@code null} is returned. * * If the {@code viewport}'s view component is not a {@code JLayer}, - * this method is equal to {@link JViewport#getView()} - * otherwise {@link JLayer#getView()} will be recursively tested + * this method is equivalent to {@link JViewport#getView()} + * otherwise {@link JLayer#getView()} will be recursively + * called on all descending {@code JLayer}s. + * + * @param viewport {@code JViewport} to get the first descendant of, + * which in not a {@code JLayer} instance. * * @return the first {@code JViewport}'s descendant - * which is not an instance of {@code JLayer} or {@code null}. + * which is not an instance of {@code JLayer}. + * If such a descendant can not be found, {@code null} is returned. * * @throws NullPointerException if {@code viewport} is {@code null} * @see JViewport#getView() * @see JLayer + * + * @since 1.7 */ - static Component getUnwrappedView(JViewport viewport) { + public static Component getUnwrappedView(JViewport viewport) { Component view = viewport.getView(); while (view instanceof JLayer) { view = ((JLayer)view).getView(); diff --git a/jdk/src/share/classes/javax/swing/text/JTextComponent.java b/jdk/src/share/classes/javax/swing/text/JTextComponent.java index 25ddaf9e3cc..832c6095ec2 100644 --- a/jdk/src/share/classes/javax/swing/text/JTextComponent.java +++ b/jdk/src/share/classes/javax/swing/text/JTextComponent.java @@ -2069,9 +2069,9 @@ public abstract class JTextComponent extends JComponent implements Scrollable, A * width to match its own */ public boolean getScrollableTracksViewportWidth() { - JViewport port = SwingUtilities.getParentViewport(this); - if (port != null) { - return port.getWidth() > getPreferredSize().width; + Container parent = SwingUtilities.getUnwrappedParent(this); + if (parent instanceof JViewport) { + return parent.getWidth() > getPreferredSize().width; } return false; } @@ -2090,9 +2090,9 @@ public abstract class JTextComponent extends JComponent implements Scrollable, A * to match its own */ public boolean getScrollableTracksViewportHeight() { - JViewport port = SwingUtilities.getParentViewport(this); - if (port != null) { - return (port.getHeight() > getPreferredSize().height); + Container parent = SwingUtilities.getUnwrappedParent(this); + if (parent instanceof JViewport) { + return parent.getHeight() > getPreferredSize().height; } return false; }