OpenJDK / jdk / jdk
changeset 54237:7d5e595cb7aa
8215396: JTabbedPane preferred size calculation is wrong for SCROLL_TAB_LAYOUT
Reviewed-by: serb
author | psadhukhan |
---|---|
date | Fri, 08 Mar 2019 14:07:10 +0530 |
parents | a5af6175d62b |
children | 371d29d4add5 |
files | src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTabbedPaneUI.java test/jdk/javax/swing/JTabbedPane/TabProb.java |
diffstat | 2 files changed, 128 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTabbedPaneUI.java Thu Mar 07 12:51:02 2019 +0530 +++ b/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTabbedPaneUI.java Fri Mar 08 14:07:10 2019 +0530 @@ -3322,11 +3322,11 @@ private class TabbedPaneScrollLayout extends TabbedPaneLayout { protected int preferredTabAreaHeight(int tabPlacement, int width) { - return calculateMaxTabHeight(tabPlacement); + return calculateTabAreaHeight(tabPlacement, 1, calculateMaxTabHeight(tabPlacement)); } protected int preferredTabAreaWidth(int tabPlacement, int height) { - return calculateMaxTabWidth(tabPlacement); + return calculateTabAreaWidth(tabPlacement, 1, calculateMaxTabWidth(tabPlacement)); } @SuppressWarnings("deprecation")
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/jdk/javax/swing/JTabbedPane/TabProb.java Fri Mar 08 14:07:10 2019 +0530 @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2019, 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. + */ + +/* @test + @bug 8215396 + @key headful + @summary Verifies JTabbedPane preferred size calculation is wrong + for SCROLL_TAB_LAYOUT. + @run main TabProb + */ + +import java.awt.Component; +import java.awt.Container; +import java.awt.Color; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.LayoutManager; +import java.awt.Insets; +import java.awt.Robot; +import javax.swing.BorderFactory; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTabbedPane; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; + +public class TabProb extends JFrame { + static TabProb tb1; + static TabProb tb2; + class FixLayout implements LayoutManager { + @Override + public void layoutContainer(Container C) { + Insets in = C.getInsets(); + int w = 200 - in.left - in.right; + int h = 100 - in.top - in.bottom; + C.getComponents()[0].setBounds(in.top, in.left, w, h); + } + @Override + public Dimension minimumLayoutSize(Container C) { + return new Dimension(200, 100); + } + @Override + public Dimension preferredLayoutSize(Container C) { + return new Dimension(200, 100); + } + @Override + public void removeLayoutComponent(Component c) { + } + @Override + public void addLayoutComponent(String s, Component c) { + } + } + + public TabProb(int layoutPolicy) { + JTabbedPane tabpanel = new JTabbedPane(); + tabpanel.setTabPlacement(JTabbedPane.TOP); + tabpanel.setTabLayoutPolicy(layoutPolicy); + JPanel panel = new JPanel(new FixLayout()); + JLabel label = new JLabel("Label"); + label.setBorder(BorderFactory.createLineBorder(Color.green, 3)); + panel.add(label); + tabpanel.add("TEST", panel); + add(tabpanel, BorderLayout.CENTER); + setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + } + + public static void main(String[] args) throws Exception { + for (UIManager.LookAndFeelInfo laf : UIManager.getInstalledLookAndFeels()) { + System.out.println("Test for LookAndFeel " + laf.getClassName()); + UIManager.setLookAndFeel(laf.getClassName()); + test(); + System.out.println("Test passed for LookAndFeel " + laf.getClassName()); + } + } + + public static void test() throws Exception { + Robot robot = new Robot(); + SwingUtilities.invokeAndWait(new Runnable() { + @Override + public void run() { + tb1 = new TabProb(JTabbedPane.SCROLL_TAB_LAYOUT); + tb1.pack(); + tb1.setVisible(true); + + tb2 = new TabProb(JTabbedPane.WRAP_TAB_LAYOUT); + tb2.pack(); + tb2.setVisible(true); + } + }); + double tb1height = tb1.getPreferredSize().getHeight(); + double tb2height = tb2.getPreferredSize().getHeight(); + System.out.println(tb1height); + System.out.println(tb2height); + + robot.waitForIdle(); + robot.delay(2000); + + SwingUtilities.invokeAndWait(() -> tb1.dispose()); + SwingUtilities.invokeAndWait(() -> tb2.dispose()); + + if (tb1height != tb2height) { + throw new RuntimeException("JTabbedPane preferred size calculation is wrong for SCROLL_TAB_LAYOUT"); + } + } +}