JDK-6604739 : JPopupMenu.Separator.getPreferredSize() throws NullPointerException
  • Type: Bug
  • Component: client-libs
  • Sub-Component: javax.swing
  • Affected Version: 6
  • Priority: P4
  • Status: Closed
  • Resolution: Duplicate
  • OS: windows_xp
  • CPU: x86
  • Submitted: 2007-09-14
  • Updated: 2010-04-04
  • Resolved: 2007-09-20
Related Reports
Duplicate :  
Description
FULL PRODUCT VERSION :
java version "1.6.0_02"
Java(TM) SE Runtime Environment (build 1.6.0_02-b06)
Java HotSpot(TM) Client VM (build 1.6.0_02-b06, mixed mode, sharing)

ADDITIONAL OS VERSION INFORMATION :
This has been observed on both Windows XP SP 2 and Windows 2003 SP 1

EXTRA RELEVANT SYSTEM CONFIGURATION :
not relevant

A DESCRIPTION OF THE PROBLEM :
If getPreferredSize() is called on a JPopupMenu.Separator before it is added to a JMenu, you get a NullPointerException with the following stack trace:

java.lang.NullPointerException
	at sun.font.FontManager.getFont2D(Native Method)
	at sun.font.FontDesignMetrics.initMatrixAndMetrics(FontDesignMetrics.java:343)
	at sun.font.FontDesignMetrics.<init>(FontDesignMetrics.java:336)
	at sun.font.FontDesignMetrics.getMetrics(FontDesignMetrics.java:284)
	at sun.swing.SwingUtilities2.getFontMetrics(SwingUtilities2.java:915)
	at javax.swing.JComponent.getFontMetrics(JComponent.java:1597)
	at com.sun.java.swing.plaf.windows.WindowsPopupMenuSeparatorUI.getPreferredSize(WindowsPopupMenuSeparatorUI.java:68)
	at javax.swing.JComponent.getPreferredSize(JComponent.java:1632)


STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Run the executable test case.

EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
I was expecting to get a Dimension object back. Even if the object was Dimension (0,0), that would be better than an NPE. Idealling I would get a Dimension object that represented the preferred size using the default menu font.
ACTUAL -
See stack trace above.

ERROR MESSAGES/STACK TRACES THAT OCCUR :
See stack trace above.

REPRODUCIBILITY :
This bug can be reproduced always.

---------- BEGIN SOURCE ----------
package com.silverlink.test;

import java.awt.*;
import javax.swing.*;

public class Test {
    public static void main(String[] args) {
        try {
            SwingUtilities.invokeAndWait(new Runnable() {
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                        JPopupMenu.Separator separator = new JPopupMenu.Separator();
                        /*
                         * Uncomment the following to avoid the NPE
                         *
                        JMenu menu = new JMenu();
                        separator.setFont(menu.getFont());
                         *
                         */
                        Dimension size = separator.getPreferredSize();
                        System.out.println("A popup menu's preferred size is " + size);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
---------- END SOURCE ----------

CUSTOMER SUBMITTED WORKAROUND :
As shown in the source code above, assigning a font to the Separator avoids the bug. This is counterintuitive, however.