# HG changeset patch # User alexp # Date 1276623179 -14400 # Node ID 2a390122edffa1b56cbd75967150748ec3b63041 # Parent 2016aba516897e4bd58daf340055531782a92f3a 6739756: JToolBar leaves space for non-visible items under Nimbus L&F Reviewed-by: peterz diff -r 2016aba51689 -r 2a390122edff jdk/src/share/classes/javax/swing/plaf/synth/SynthToolBarUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthToolBarUI.java Tue Jun 15 21:28:22 2010 +0400 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthToolBarUI.java Tue Jun 15 21:32:59 2010 +0400 @@ -363,18 +363,24 @@ SynthIcon.getIconWidth(handleIcon, context) : 0; Dimension compDim; for (int i = 0; i < tb.getComponentCount(); i++) { - compDim = tb.getComponent(i).getMinimumSize(); - dim.width += compDim.width; - dim.height = Math.max(dim.height, compDim.height); + Component component = tb.getComponent(i); + if (component.isVisible()) { + compDim = component.getMinimumSize(); + dim.width += compDim.width; + dim.height = Math.max(dim.height, compDim.height); + } } } else { dim.height = tb.isFloatable() ? SynthIcon.getIconHeight(handleIcon, context) : 0; Dimension compDim; for (int i = 0; i < tb.getComponentCount(); i++) { - compDim = tb.getComponent(i).getMinimumSize(); - dim.width = Math.max(dim.width, compDim.width); - dim.height += compDim.height; + Component component = tb.getComponent(i); + if (component.isVisible()) { + compDim = component.getMinimumSize(); + dim.width = Math.max(dim.width, compDim.width); + dim.height += compDim.height; + } } } dim.width += insets.left + insets.right; @@ -395,18 +401,24 @@ SynthIcon.getIconWidth(handleIcon, context) : 0; Dimension compDim; for (int i = 0; i < tb.getComponentCount(); i++) { - compDim = tb.getComponent(i).getPreferredSize(); - dim.width += compDim.width; - dim.height = Math.max(dim.height, compDim.height); + Component component = tb.getComponent(i); + if (component.isVisible()) { + compDim = component.getPreferredSize(); + dim.width += compDim.width; + dim.height = Math.max(dim.height, compDim.height); + } } } else { dim.height = tb.isFloatable() ? SynthIcon.getIconHeight(handleIcon, context) : 0; Dimension compDim; for (int i = 0; i < tb.getComponentCount(); i++) { - compDim = tb.getComponent(i).getPreferredSize(); - dim.width = Math.max(dim.width, compDim.width); - dim.height += compDim.height; + Component component = tb.getComponent(i); + if (component.isVisible()) { + compDim = component.getPreferredSize(); + dim.width = Math.max(dim.width, compDim.width); + dim.height += compDim.height; + } } } dim.width += insets.left + insets.right; @@ -469,22 +481,24 @@ for (int i = 0; i < tb.getComponentCount(); i++) { c = tb.getComponent(i); - d = c.getPreferredSize(); - int y, h; - if (d.height >= baseH || c instanceof JSeparator) { - // Fill available height - y = baseY; - h = baseH; - } else { - // Center component vertically in the available space - y = baseY + (baseH / 2) - (d.height / 2); - h = d.height; + if (c.isVisible()) { + d = c.getPreferredSize(); + int y, h; + if (d.height >= baseH || c instanceof JSeparator) { + // Fill available height + y = baseY; + h = baseH; + } else { + // Center component vertically in the available space + y = baseY + (baseH / 2) - (d.height / 2); + h = d.height; + } + //if the component is a "glue" component then add to its + //width the extraSpacePerGlue it is due + if (isGlue(c)) d.width += extraSpacePerGlue; + c.setBounds(ltr ? x : x - d.width, y, d.width, h); + x = ltr ? x + d.width : x - d.width; } - //if the component is a "glue" component then add to its - //width the extraSpacePerGlue it is due - if (isGlue(c)) d.width += extraSpacePerGlue; - c.setBounds(ltr ? x : x - d.width, y, d.width, h); - x = ltr ? x + d.width : x - d.width; } } else { int handleHeight = tb.isFloatable() ? @@ -512,29 +526,31 @@ for (int i = 0; i < tb.getComponentCount(); i++) { c = tb.getComponent(i); - d = c.getPreferredSize(); - int x, w; - if (d.width >= baseW || c instanceof JSeparator) { - // Fill available width - x = baseX; - w = baseW; - } else { - // Center component horizontally in the available space - x = baseX + (baseW / 2) - (d.width / 2); - w = d.width; + if (c.isVisible()) { + d = c.getPreferredSize(); + int x, w; + if (d.width >= baseW || c instanceof JSeparator) { + // Fill available width + x = baseX; + w = baseW; + } else { + // Center component horizontally in the available space + x = baseX + (baseW / 2) - (d.width / 2); + w = d.width; + } + //if the component is a "glue" component then add to its + //height the extraSpacePerGlue it is due + if (isGlue(c)) d.height += extraSpacePerGlue; + c.setBounds(x, y, w, d.height); + y += d.height; } - //if the component is a "glue" component then add to its - //height the extraSpacePerGlue it is due - if (isGlue(c)) d.height += extraSpacePerGlue; - c.setBounds(x, y, w, d.height); - y += d.height; } } context.dispose(); } private boolean isGlue(Component c) { - if (c instanceof Box.Filler) { + if (c.isVisible() && c instanceof Box.Filler) { Box.Filler f = (Box.Filler)c; Dimension min = f.getMinimumSize(); Dimension pref = f.getPreferredSize(); diff -r 2016aba51689 -r 2a390122edff jdk/test/javax/swing/plaf/synth/SynthToolBarUI/6739756/bug6739756.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/plaf/synth/SynthToolBarUI/6739756/bug6739756.java Tue Jun 15 21:32:59 2010 +0400 @@ -0,0 +1,59 @@ +/* + * Copyright 2010 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/** + * @test + * @bug 6739756 + * @author Alexander Potochkin + * @summary JToolBar leaves space for non-visible items under Nimbus L&F + * @run main bug6739756 + */ + +import javax.swing.*; +import java.awt.*; + +public class bug6739756 { + + public static void main(String[] args) throws Exception { + try { + UIManager.setLookAndFeel( + "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); + } + catch (Exception e) { + e.printStackTrace(); + return; + } + SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + JToolBar tb = new JToolBar(); + Dimension preferredSize = tb.getPreferredSize(); + JButton button = new JButton("Test"); + button.setVisible(false); + tb.add(button); + if (!preferredSize.equals(tb.getPreferredSize())) { + throw new RuntimeException("Toolbar's preferredSize is wrong"); + } + } + }); + } +}