Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-7195179

ClassCastException for null values in JComboBox

XMLWordPrintable

    • 7u3
    • b110
    • x86
    • windows_7

      FULL PRODUCT VERSION :
      jre7u3 - jre7u6

      ADDITIONAL OS VERSION INFORMATION :
      Windows7

      A DESCRIPTION OF THE PROBLEM :
      ClassCastException in rendering null value in JComboBox

      REGRESSION. Last worked in version 6u31


      ERROR MESSAGES/STACK TRACES THAT OCCUR :
      Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
      at info.fingo.asist.ComboBoxTest$IntComboRenderer.getListCellRendererComponent(ComboBoxTest.java:1)
      at javax.swing.plaf.basic.BasicComboBoxUI.getBaseline(BasicComboBoxUI.java:979)
      at javax.swing.plaf.metal.MetalComboBoxUI.getBaseline(MetalComboBoxUI.java:149)
      at javax.swing.JComponent.getBaseline(JComponent.java:2560)
      at javax.swing.GroupLayout$ComponentSpring.getBaseline(GroupLayout.java:3075)
      at javax.swing.GroupLayout$BaselineGroup.calculateBaselineAndResizeBehavior(GroupLayout.java:2732)
      at javax.swing.GroupLayout$BaselineGroup.calculateSize(GroupLayout.java:2708)
      at javax.swing.GroupLayout$Group.calculatePreferredSize(GroupLayout.java:1602)
      at javax.swing.GroupLayout$Spring.getPreferredSize(GroupLayout.java:1346)
      at javax.swing.GroupLayout$Group.getSpringSize(GroupLayout.java:1638)
      at javax.swing.GroupLayout$Group.calculateSize(GroupLayout.java:1622)
      at javax.swing.GroupLayout$Group.calculatePreferredSize(GroupLayout.java:1602)
      at javax.swing.GroupLayout$Spring.getPreferredSize(GroupLayout.java:1346)
      at javax.swing.GroupLayout$Group.getSpringSize(GroupLayout.java:1638)
      at javax.swing.GroupLayout$Group.calculateSize(GroupLayout.java:1624)
      at javax.swing.GroupLayout$Group.calculatePreferredSize(GroupLayout.java:1602)
      at javax.swing.GroupLayout$Spring.getPreferredSize(GroupLayout.java:1346)
      at javax.swing.GroupLayout.calculateAutopadding(GroupLayout.java:1071)
      at javax.swing.GroupLayout.prepare(GroupLayout.java:1059)
      at javax.swing.GroupLayout.preferredLayoutSize(GroupLayout.java:878)
      at java.awt.Container.preferredSize(Container.java:1788)
      at java.awt.Container.getPreferredSize(Container.java:1773)
      at javax.swing.JComponent.getPreferredSize(JComponent.java:1662)
      at java.awt.BorderLayout.preferredLayoutSize(BorderLayout.java:719)
      at java.awt.Container.preferredSize(Container.java:1788)
      at java.awt.Container.getPreferredSize(Container.java:1773)
      at javax.swing.JComponent.getPreferredSize(JComponent.java:1662)
      at javax.swing.JRootPane$RootLayout.preferredLayoutSize(JRootPane.java:917)
      at java.awt.Container.preferredSize(Container.java:1788)
      at java.awt.Container.getPreferredSize(Container.java:1773)
      at javax.swing.JComponent.getPreferredSize(JComponent.java:1662)
      at java.awt.BorderLayout.preferredLayoutSize(BorderLayout.java:719)
      at java.awt.Container.preferredSize(Container.java:1788)
      at java.awt.Container.getPreferredSize(Container.java:1773)
      at java.awt.Window.pack(Window.java:809)
      at info.fingo.asist.ComboBoxTest.main(ComboBoxTest.java:66)
      Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
      at info.fingo.asist.ComboBoxTest$IntComboRenderer.getListCellRendererComponent(ComboBoxTest.java:1)
      at javax.swing.plaf.basic.BasicComboBoxUI.getBaseline(BasicComboBoxUI.java:979)
      at javax.swing.plaf.metal.MetalComboBoxUI.getBaseline(MetalComboBoxUI.java:149)
      at javax.swing.JComponent.getBaseline(JComponent.java:2560)
      at javax.swing.GroupLayout$ComponentSpring.getBaseline(GroupLayout.java:3075)
      at javax.swing.GroupLayout$BaselineGroup.calculateBaselineAndResizeBehavior(GroupLayout.java:2732)
      at javax.swing.GroupLayout$BaselineGroup.calculateSize(GroupLayout.java:2708)
      at javax.swing.GroupLayout$Group.calculatePreferredSize(GroupLayout.java:1602)
      at javax.swing.GroupLayout$Spring.getPreferredSize(GroupLayout.java:1346)
      at javax.swing.GroupLayout$Group.getSpringSize(GroupLayout.java:1638)
      at javax.swing.GroupLayout$Group.calculateSize(GroupLayout.java:1622)
      at javax.swing.GroupLayout$Group.calculatePreferredSize(GroupLayout.java:1602)
      at javax.swing.GroupLayout$Spring.getPreferredSize(GroupLayout.java:1346)
      at javax.swing.GroupLayout$Group.getSpringSize(GroupLayout.java:1638)
      at javax.swing.GroupLayout$Group.calculateSize(GroupLayout.java:1624)
      at javax.swing.GroupLayout$Group.calculatePreferredSize(GroupLayout.java:1602)
      at javax.swing.GroupLayout$Spring.getPreferredSize(GroupLayout.java:1346)
      at javax.swing.GroupLayout$SequentialGroup.setValidSize(GroupLayout.java:2017)
      at javax.swing.GroupLayout$Group.setSize(GroupLayout.java:1587)
      at javax.swing.GroupLayout.calculateAutopadding(GroupLayout.java:1079)
      at javax.swing.GroupLayout.layoutContainer(GroupLayout.java:920)
      at java.awt.Container.layout(Container.java:1503)
      at java.awt.Container.doLayout(Container.java:1492)
      at java.awt.Container.validateTree(Container.java:1688)
      at java.awt.Container.validateTree(Container.java:1697)
      at java.awt.Container.validateTree(Container.java:1697)
      at java.awt.Container.validateTree(Container.java:1697)
      at java.awt.Container.validateTree(Container.java:1697)
      at java.awt.Container.validate(Container.java:1623)
      at java.awt.Window.dispatchEventImpl(Window.java:2717)
      at java.awt.Component.dispatchEvent(Component.java:4687)
      at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:713)
      at java.awt.EventQueue.access$000(EventQueue.java:104)
      at java.awt.EventQueue$3.run(EventQueue.java:672)
      at java.awt.EventQueue$3.run(EventQueue.java:670)
      at java.security.AccessController.doPrivileged(Native Method)
      at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
      at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
      at java.awt.EventQueue$4.run(EventQueue.java:686)
      at java.awt.EventQueue$4.run(EventQueue.java:684)
      at java.security.AccessController.doPrivileged(Native Method)
      at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
      at java.awt.EventQueue.dispatchEvent(EventQueue.java:683)
      at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
      at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
      at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
      at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
      at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
      at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)
      Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
      at info.fingo.asist.ComboBoxTest$IntComboRenderer.getListCellRendererComponent(ComboBoxTest.java:1)
      at javax.swing.plaf.basic.BasicComboBoxUI.getBaseline(BasicComboBoxUI.java:979)
      at javax.swing.plaf.metal.MetalComboBoxUI.getBaseline(MetalComboBoxUI.java:149)
      at javax.swing.JComponent.getBaseline(JComponent.java:2560)
      at javax.swing.GroupLayout$ComponentSpring.getBaseline(GroupLayout.java:3075)
      at javax.swing.GroupLayout$BaselineGroup.calculateBaselineAndResizeBehavior(GroupLayout.java:2732)
      at javax.swing.GroupLayout$BaselineGroup.calculateSize(GroupLayout.java:2708)
      at javax.swing.GroupLayout$Group.calculatePreferredSize(GroupLayout.java:1602)
      at javax.swing.GroupLayout$Spring.getPreferredSize(GroupLayout.java:1346)
      at javax.swing.GroupLayout$Group.getSpringSize(GroupLayout.java:1638)
      at javax.swing.GroupLayout$Group.calculateSize(GroupLayout.java:1622)
      at javax.swing.GroupLayout$Group.calculatePreferredSize(GroupLayout.java:1602)
      at javax.swing.GroupLayout$Spring.getPreferredSize(GroupLayout.java:1346)
      at javax.swing.GroupLayout$Group.getSpringSize(GroupLayout.java:1638)
      at javax.swing.GroupLayout$Group.calculateSize(GroupLayout.java:1624)
      at javax.swing.GroupLayout$Group.calculatePreferredSize(GroupLayout.java:1602)
      at javax.swing.GroupLayout$Spring.getPreferredSize(GroupLayout.java:1346)
      at javax.swing.GroupLayout$SequentialGroup.setValidSize(GroupLayout.java:2017)
      at javax.swing.GroupLayout$Group.setSize(GroupLayout.java:1587)
      at javax.swing.GroupLayout.calculateAutopadding(GroupLayout.java:1079)
      at javax.swing.GroupLayout.layoutContainer(GroupLayout.java:920)
      at java.awt.Container.layout(Container.java:1503)
      at java.awt.Container.doLayout(Container.java:1492)
      at java.awt.Container.validateTree(Container.java:1688)
      at java.awt.Container.validateTree(Container.java:1697)
      at java.awt.Container.validateTree(Container.java:1697)
      at java.awt.Container.validateTree(Container.java:1697)
      at java.awt.Container.validateTree(Container.java:1697)
      at java.awt.Container.validate(Container.java:1623)
      at java.awt.Window.dispatchEventImpl(Window.java:2717)
      at java.awt.Component.dispatchEvent(Component.java:4687)
      at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:713)
      at java.awt.EventQueue.access$000(EventQueue.java:104)
      at java.awt.EventQueue$3.run(EventQueue.java:672)
      at java.awt.EventQueue$3.run(EventQueue.java:670)
      at java.security.AccessController.doPrivileged(Native Method)
      at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
      at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
      at java.awt.EventQueue$4.run(EventQueue.java:686)
      at java.awt.EventQueue$4.run(EventQueue.java:684)
      at java.security.AccessController.doPrivileged(Native Method)
      at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
      at java.awt.EventQueue.dispatchEvent(EventQueue.java:683)
      at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
      at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
      at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
      at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
      at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
      at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)


      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------

      /**
       * 30-08-2012
       */
      package info.fingo.asist;


      import java.awt.Component;
      import java.io.Serializable;

      import javax.swing.GroupLayout;
      import javax.swing.GroupLayout.Alignment;
      import javax.swing.GroupLayout.ParallelGroup;
      import javax.swing.JComboBox;
      import javax.swing.JDialog;
      import javax.swing.JLabel;
      import javax.swing.JList;
      import javax.swing.JPanel;
      import javax.swing.ListCellRenderer;
      import javax.swing.plaf.basic.BasicComboBoxRenderer;

      public class ComboBoxTest
      {
      public static class IntComboRenderer implements ListCellRenderer<Integer>, Serializable
      {

      private static final long serialVersionUID = 1L;

      protected final BasicComboBoxRenderer wrapped;

      public IntComboRenderer()
      {
      super();
      this.wrapped = new BasicComboBoxRenderer();
      }

      @Override
      public Component getListCellRendererComponent( JList<? extends Integer> list, Integer value, int index,
      boolean isSelected, boolean cellHasFocus )
      {
      this.wrapped.getListCellRendererComponent( list, value, index, isSelected, cellHasFocus );

      if( value != null )
      {
      this.wrapped.setText( value.toString() );
      }
      else
      {
      this.wrapped.setText( "" );
      }
      return this.wrapped;
      }

      }

      public static void main( String[] args )
      {
      JDialog dialog = new JDialog();
      dialog.add( createPanel() );
      dialog.setModal( true );
      dialog.pack();
      dialog.setVisible( true );
      }

      private static JPanel createPanel()
      {
      // does not work
      Integer[] items = new Integer[] { null, 1, 2 };
      // works fine
      // Integer[] items = new Integer[] { 1, 2 };
      JComboBox<Integer> nameTF = new JComboBox<>( items );

      nameTF.setSelectedIndex( 0 );
      nameTF.setRenderer( new IntComboRenderer() );

      JPanel panel = new JPanel();

      GroupLayout layout = new GroupLayout( panel );
      panel.setLayout( layout );
      layout.setAutoCreateContainerGaps( true );
      layout.setAutoCreateGaps( true );

      GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();
      GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup();
      ParallelGroup labelsHG = layout.createParallelGroup();
      ParallelGroup componentsHG = layout.createParallelGroup();

      JLabel nameLabel = new JLabel( "mapping.instance.dialog_new.field_name" );
      labelsHG.addComponent( nameLabel );
      componentsHG.addComponent( nameTF );
      vGroup.addGroup( layout.createParallelGroup( Alignment.BASELINE ).addComponent( nameLabel ).addComponent(
      nameTF ) );

      hGroup.addGroup( labelsHG );
      hGroup.addGroup( componentsHG );
      layout.setHorizontalGroup( hGroup );
      layout.setVerticalGroup( vGroup );
      return panel;
      }

      }

      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      Change null handling in BasicComboBoxUI.getBaseline
      line:

      // if( value == null )
      // {
      // value = " ";
      // }
      // else if( value instanceof String && "".equals( value ) )
      // {
      // value = " ";
      // }

            malenkov Sergey Malenkov (Inactive)
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: