JDK-6495411 : JTabbedPane throws Exception at java.util.Vector.elementAt
  • Type: Bug
  • Component: client-libs
  • Sub-Component: javax.swing
  • Affected Version: 5.0u9
  • Priority: P4
  • Status: Closed
  • Resolution: Duplicate
  • OS: windows_xp
  • CPU: x86
  • Submitted: 2006-11-20
  • Updated: 2011-02-16
  • Resolved: 2006-11-21
Related Reports
Duplicate :  
Description
FULL PRODUCT VERSION :
java version "1.5.0_09"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_09-b01)
Java HotSpot(TM) Client VM (build 1.5.0_09-b01, mixed mode)

ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows XP [Version 5.1.2600]

A DESCRIPTION OF THE PROBLEM :
if one of the tabs has html text in it, adding another tab with a null component generates an exception in Vector.elementAt(). Uncomment the line indicated in the test case to see this other bug. 

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Execute the testcase

ERROR MESSAGES/STACK TRACES THAT OCCUR :
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 2 >= 2
        at java.util.Vector.elementAt(Vector.java:432)
        at javax.swing.plaf.basic.BasicTabbedPaneUI.getTextViewForTab(BasicTabbedPaneUI.java:1483)
        at javax.swing.plaf.basic.BasicTabbedPaneUI.calculateTabWidth(BasicTabbedPaneUI.java:1528)
        at javax.swing.plaf.basic.BasicTabbedPaneUI.calculateMaxTabWidth(BasicTabbedPaneUI.java:1546)
        at javax.swing.plaf.basic.BasicTabbedPaneUI$TabbedPaneLayout.calculateTabRects(BasicTabbedPaneUI.java:2286)
        at javax.swing.plaf.basic.BasicTabbedPaneUI$TabbedPaneLayout.calculateLayoutInfo(BasicTabbedPaneUI.java:2263)
        at javax.swing.plaf.basic.BasicTabbedPaneUI$TabbedPaneLayout.layoutContainer(BasicTabbedPaneUI.java:2178)
        at java.awt.Container.layout(Container.java:1401)
        at java.awt.Container.doLayout(Container.java:1390)
        at java.awt.Container.validateTree(Container.java:1473)
        at java.awt.Container.validateTree(Container.java:1480)
        at java.awt.Container.validateTree(Container.java:1480)
        at java.awt.Container.validate(Container.java:1448)
        at javax.swing.RepaintManager.validateInvalidComponents(RepaintManager.java:379)
        at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:113)

---------- BEGIN SOURCE ----------
import java.awt.*;
import javax.swing.*;
import static java.awt.RenderingHints.*;
import java.awt.event.KeyEvent;
import java.awt.geom.GeneralPath;
public class BugReport {
    public static void main(String[] args) throws Exception {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
       
        final JTabbedPane tabs = new JTabbedPane();
        tabs.setTabPlacement(JTabbedPane.LEFT);
       
        // Another (bonus) bug - if one of the tabs has html text in it
        // adding a tab with a null component will then generate an NPE
        // in Vector.elementAt(), uncomment the line below to see this
        tabs.addTab("<HTML><FONT size = 10>TAB</FONT></HTML>",new JPanel());
        tabs.addTab(null, new TabIcon(), new JPanel());
       
        JFrame frame = new JFrame("Bug Report");
        frame.setContentPane(tabs);
        frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
        frame.setBounds(100,100,200,600);
        frame.setVisible(true);
       
        Thread.sleep(1000);
       
        final Robot robot = new Robot();
        final Rectangle d = new Rectangle();
        final Point p = new Point();
       
        Runnable runner = new Runnable(){
            public void run(){
                try {
                    for (int i=0; i<7; i++){
                        Thread.sleep(1000);
                        SwingUtilities.invokeLater(new Runnable(){
                            public void run(){
                                int tab = tabs.getTabCount()-1;
                                d.setBounds(tabs.getBoundsAt(tab));
                                p.setLocation(d.x+d.width/2,d.y+d.height/2);
                                SwingUtilities.convertPointToScreen(p,tabs);
                                robot.mouseMove(p.x,p.y+d.height);
                                tabs.addTab(null, new TabIcon(), null);
                            }
                        });
                    }
                } catch (Exception ex) {}
            }
        };
        runner.run();
    }
   
    static final class TabIcon implements Icon {
        final int W = 60;
        public TabIcon() {
        }
        public int getIconHeight() {
            return W;
        }
        public int getIconWidth() {
            return W;
        }
        public void paintIcon(Component c, Graphics g, int x, int y) {
            Graphics2D g2 = (Graphics2D)g.create();
            Color iconColor = Color.BLUE;
            g2.setRenderingHint(KEY_ANTIALIASING, VALUE_ANTIALIAS_ON);
            g2.setRenderingHint(KEY_RENDERING, VALUE_RENDER_QUALITY);
            g2.setColor(Color.BLUE);
            g2.fillOval(x, y, W, W);
            g2.setColor(Color.RED);
            GeneralPath path = new GeneralPath();
            path.moveTo(x+W/2,y+W/2);
            for (int i=0; i<10000; i++){
                path.lineTo(x+W/4+(float)Math.random()*W/2, y+W/4+(float)Math.random()*W/2);
            }
            g2.draw(path);
            g2.dispose();
        }
    }
}
---------- END SOURCE ----------


REPRODUCIBILITY :
This bug can be reproduced always.
*** (#1 of 1): 2006-11-20 13:12:18 GMT+05:30 ###@###.###

Comments
EVALUATION The described problem caused by the same reason as 6495408 Closed as duplicate
21-11-2006