FULL PRODUCT VERSION :
java version "1.7.0-ea"
Java(TM) SE Runtime Environment (build 1.7.0-ea-b137)
Java HotSpot(TM) Client VM (build 21.0-b07, mixed mode, sharing)
ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows XP [Version 5.1.2600]
A DESCRIPTION OF THE PROBLEM :
Using the supplied code, Java 7 throws a NullPointerException. Java 6 and earlier work fine.
Unfortunately I can't attach the icon.png file I used but any image will do.
REGRESSION. Last worked in version 6u24
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Load the class
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Class displays a menu with an icon but no text
ACTUAL -
An exception is thrown
ERROR MESSAGES/STACK TRACES THAT OCCUR :
Exception in thread "main" java.lang.NullPointerException
at sun.swing.SwingUtilities2.getLeftSideBearing(SwingUtilities2.java:274)
at sun.swing.MenuItemLayoutHelper.getLeftExtraWidth(MenuItemLayoutHelper.java:162)
at sun.swing.MenuItemLayoutHelper.calcExtraWidths(MenuItemLayoutHelper.java:158)
at sun.swing.MenuItemLayoutHelper.reset(MenuItemLayoutHelper.java:148)
at sun.swing.MenuItemLayoutHelper.<init>(MenuItemLayoutHelper.java:107)
at javax.swing.plaf.basic.BasicMenuItemUI.getPreferredMenuItemSize(BasicMenuItemUI.java:412)
at javax.swing.plaf.basic.BasicMenuItemUI.getPreferredSize(BasicMenuItemUI.java:367)
at javax.swing.JComponent.getPreferredSize(JComponent.java:1660)
at javax.swing.BoxLayout.checkRequests(BoxLayout.java:483)
at javax.swing.BoxLayout.preferredLayoutSize(BoxLayout.java:300)
at javax.swing.plaf.basic.DefaultMenuLayout.preferredLayoutSize(DefaultMenuLayout.java:60)
at java.awt.Container.preferredSize(Container.java:1772)
at java.awt.Container.getPreferredSize(Container.java:1757)
at javax.swing.JComponent.getPreferredSize(JComponent.java:1662)
at javax.swing.JRootPane$RootLayout.preferredLayoutSize(JRootPane.java:922)
at java.awt.Container.preferredSize(Container.java:1772)
at java.awt.Container.getPreferredSize(Container.java:1757)
at javax.swing.JComponent.getPreferredSize(JComponent.java:1662)
at java.awt.BorderLayout.preferredLayoutSize(BorderLayout.java:719)
at java.awt.Container.preferredSize(Container.java:1772)
at java.awt.Container.getPreferredSize(Container.java:1757)
at java.awt.Window.pack(Window.java:808)
at replication.NullMenuIssue.<init>(NullMenuIssue.java:19)
at replication.NullMenuIssue.main(NullMenuIssue.java:33)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:613)
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
package replication;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
public final class NullMenuIssue extends JFrame {
public NullMenuIssue() throws HeadlessException {
super("Null Menu Name Test");
JMenuBar bar = new JMenuBar();
bar.add(createMenu());
setJMenuBar(bar);
pack();
}
private JMenu createMenu() {
final String name = null;
final ImageIcon icon = new ImageIcon(getClass().getResource("icon.png"));
Action menuAction = new TestAction(name, icon);
JMenu menu = new JMenu(menuAction);
menu.add(new JMenuItem("test"));
return menu;
}
public static void main(String[] args) {
final NullMenuIssue nullMenuIssue = new NullMenuIssue();
nullMenuIssue.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
nullMenuIssue.setVisible(true);
}
private class TestAction extends AbstractAction {
public TestAction(final String name, final ImageIcon icon) {
super(name, icon);
}
public void actionPerformed(ActionEvent e) {
//do nothing
}
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
use an empty string instead of null for the action name.
|