6739756: JToolBar leaves space for non-visible items under Nimbus L&F
Reviewed-by: peterz
--- 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();
--- /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");
+ }
+ }
+ });
+ }
+}