# HG changeset patch # User malenkov # Date 1379689001 -14400 # Node ID 6f98c259939cc046e445d49545999eb554733fea # Parent b1cca62edf0b83dc5e269b21dec6061f4ac1603b 7024235: Nimbus L&F: wrong "packing" of a frame containing tabbed pane Reviewed-by: alexsch diff -r b1cca62edf0b -r 6f98c259939c jdk/src/share/classes/javax/swing/plaf/basic/BasicTabbedPaneUI.java --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicTabbedPaneUI.java Fri Sep 20 17:35:45 2013 +0400 +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicTabbedPaneUI.java Fri Sep 20 18:56:41 2013 +0400 @@ -2620,7 +2620,7 @@ // Never move a TAB down a run if it is in the first column. // Even if there isn't enough room, moving it to a fresh // line won't help. - if (rect.x != 2 + insets.left && rect.x + rect.width > returnAt) { + if (rect.x != x && rect.x + rect.width > returnAt) { if (runCount > tabRuns.length - 1) { expandTabRunsArray(); } @@ -2648,7 +2648,7 @@ // Never move a TAB over a run if it is in the first run. // Even if there isn't enough room, moving it to a fresh // column won't help. - if (rect.y != 2 + insets.top && rect.y + rect.height > returnAt) { + if (rect.y != y && rect.y + rect.height > returnAt) { if (runCount > tabRuns.length - 1) { expandTabRunsArray(); } diff -r b1cca62edf0b -r 6f98c259939c jdk/test/javax/swing/JTabbedPane/7024235/Test7024235.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/JTabbedPane/7024235/Test7024235.java Fri Sep 20 18:56:41 2013 +0400 @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.awt.BorderLayout; +import sun.awt.SunToolkit; + +import java.awt.Container; +import java.awt.Rectangle; +import java.awt.Toolkit; + +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JTabbedPane; + +import javax.swing.JFrame; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.UIManager.LookAndFeelInfo; + +/* + * @test + * @bug 7024235 + * @summary Tests JFrame.pack() with the JTabbedPane + * @author Sergey Malenkov + */ + +public class Test7024235 implements Runnable { + + private static final boolean AUTO = null != System.getProperty("test.src", null); + + public static void main(String[] args) throws Exception { + Test7024235 test = new Test7024235(); + SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); + for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) { + UIManager.setLookAndFeel(info.getClassName()); + + test.test(); + toolkit.realSync(); + Thread.sleep(1000); + test.test(); + } + } + + private volatile JTabbedPane pane; + private volatile boolean passed; + + public void run() { + if (this.pane == null) { + this.pane = new JTabbedPane(); + this.pane.addTab("1", new Container()); + this.pane.addTab("2", new JButton()); + this.pane.addTab("3", new JCheckBox()); + + JFrame frame = new JFrame(); + frame.add(BorderLayout.WEST, this.pane); + frame.pack(); + frame.setVisible(true); + + test("first"); + } + else { + test("second"); + if (this.passed || AUTO) { // do not close a frame for manual review + SwingUtilities.getWindowAncestor(this.pane).dispose(); + } + this.pane = null; + } + } + + private void test() throws Exception { + SwingUtilities.invokeAndWait(this); + if (!this.passed && AUTO) { // error reporting only for automatic testing + throw new Error("TEST FAILED"); + } + } + + private void test(String step) { + this.passed = true; + for (int index = 0; index < this.pane.getTabCount(); index++) { + Rectangle bounds = this.pane.getBoundsAt(index); + int centerX = bounds.x + bounds.width / 2; + int centerY = bounds.y + bounds.height / 2; + int actual = this.pane.indexAtLocation(centerX, centerY); + if (index != actual) { + System.out.println("name = " + UIManager.getLookAndFeel().getName()); + System.out.println("step = " + step); + System.out.println("index = " + index); + System.out.println("bounds = " + bounds); + System.out.println("indexAtLocation(" + centerX + "," + centerX + ") returns " + actual); + this.passed = false; + } + } + } +}