-
Bug
-
Resolution: Fixed
-
P3
-
1.3.0
-
beta
-
x86
-
windows_nt
v
Name: clC74495 Date: 10/06/99
Carlos.Lucasius@Canada (October 6, 1999): regression of bug 4110285?
/***************************************************************************
JMenuBars are damaged by serialization (they can't be serialized twice)
JMenuBars are damaged when they are serialized, such that they can't be
serialized twice in a row. This sample program can be used to
demonstrate the problem; it opens a window with a simple JMenuBar and
a button marked "Serialize".
Run the program and push the "Serialize" button; it seems to be work. But
look closely at the JMenuBar; the border is now missing! It looks like
the border was not properly re-installed at the end of the normal
serialization kludge.
Now press the "Serialize" button again; this time you get a
NullPointerException.
This bug is pretty important if you are building an IDE that supports
visual editing of menus.
This problem happens with this build (but it's been broken for years):
java version "1.3.0"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.0-G)
Java HotSpot(TM) Client VM (build 1.3-G, mixed mode)
This bug can be easily fixed in JMenuBar.java by adding this block of
code to the writeObject method, just after the call to s.defaultWriteObject():
if ((ui != null) && (getUIClassID().equals(uiClassID)))
{
ui.installUI(this);
}
Here is the output from the sample program:
Serializing...
Serialization complete.
Serializing...
Exception occurred during event dispatching:
java.lang.NullPointerException
at javax.swing.LookAndFeel.uninstallBorder(LookAndFeel.java:123)
at javax.swing.plaf.basic.BasicMenuBarUI.uninstallDefaults(BasicMenuBarUI.java:143)
at javax.swing.plaf.basic.BasicMenuBarUI.uninstallUI(BasicMenuBarUI.java:135)
at javax.swing.JComponent.compWriteObjectNotify(JComponent.java:4428)
at javax.swing.JComponent$EnableSerializationFocusListener.writeObject(JComponent.java:4418)
at java.lang.reflect.Method.invoke(Native Method)
at java.io.ObjectOutputStream.invokeObjectWriter(ObjectOutputStream.java:1811)
at java.io.ObjectOutputStream.outputObject(ObjectOutputStream.java:1186)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:362)
at java.awt.AWTEventMulticaster.save(AWTEventMulticaster.java:767)
at java.awt.Component.writeObject(Component.java:4463)
at java.lang.reflect.Method.invoke(Native Method)
at java.io.ObjectOutputStream.invokeObjectWriter(ObjectOutputStream.java:1811)
at java.io.ObjectOutputStream.outputObject(ObjectOutputStream.java:1186)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:362)
at java.io.ObjectOutputStream.outputArray(ObjectOutputStream.java:1074)
at java.io.ObjectOutputStream.checkSubstitutableSpecialClasses(ObjectOutputStream.java:452)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:357)
at java.io.ObjectOutputStream.outputClassFields(ObjectOutputStream.java:1774)
at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:473)
at java.awt.Container.writeObject(Container.java:1859)
at java.lang.reflect.Method.invoke(Native Method)
at java.io.ObjectOutputStream.invokeObjectWriter(ObjectOutputStream.java:1811)
at java.io.ObjectOutputStream.outputObject(ObjectOutputStream.java:1186)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:362)
at java.io.ObjectOutputStream.outputArray(ObjectOutputStream.java:1074)
at java.io.ObjectOutputStream.checkSubstitutableSpecialClasses(ObjectOutputStream.java:452)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:357)
at java.io.ObjectOutputStream.outputClassFields(ObjectOutputStream.java:1774)
at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:473)
at java.awt.Container.writeObject(Container.java:1859)
at java.lang.reflect.Method.invoke(Native Method)
at java.io.ObjectOutputStream.invokeObjectWriter(ObjectOutputStream.java:1811)
at java.io.ObjectOutputStream.outputObject(ObjectOutputStream.java:1186)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:362)
at java.io.ObjectOutputStream.outputArray(ObjectOutputStream.java:1074)
at java.io.ObjectOutputStream.checkSubstitutableSpecialClasses(ObjectOutputStream.java:452)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:357)
at java.io.ObjectOutputStream.outputClassFields(ObjectOutputStream.java:1774)
at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:473)
at java.awt.Container.writeObject(Container.java:1859)
at java.lang.reflect.Method.invoke(Native Method)
at java.io.ObjectOutputStream.invokeObjectWriter(ObjectOutputStream.java:1811)
at java.io.ObjectOutputStream.outputObject(ObjectOutputStream.java:1186)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:362)
at MenuBarTest.actionPerformed(MenuBarTest.java:147)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1244)
at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(AbstractButton.java:1296)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:378)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:250)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:238)
at java.awt.Component.processMouseEvent(Component.java:3677)
at java.awt.Component.processEvent(Component.java:3506)
at java.awt.Container.processEvent(Container.java:1255)
at java.awt.Component.dispatchEventImpl(Component.java:2563)
at java.awt.Container.dispatchEventImpl(Container.java:1304)
at java.awt.Component.dispatchEvent(Component.java:2466)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:2550)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:2315)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:2218)
at java.awt.Container.dispatchEventImpl(Container.java:1291)
at java.awt.Window.dispatchEventImpl(Window.java:872)
at java.awt.Component.dispatchEvent(Component.java:2466)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:322)
at java.awt.EventDispatchThread.pumpOneEvent(EventDispatchThread.java:107)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:97)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:88)
*****************************************************************************/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
public class MenuBarTest implements ActionListener
{
public static void main(String args[])
{
new MenuBarTest();
}
JFrame jf1;
JButton jb1;
JMenuBar mb;
JMenuItem mi;
JMenu m;
public MenuBarTest()
{
jf1 = new JFrame("Test JMenuBar Serialization");
jb1 = new JButton("Serialize");
jf1.setSize(300,100);
jf1.getContentPane().setLayout(new FlowLayout());
jf1.getContentPane().add(jb1);
mb = new JMenuBar();
m = new JMenu("Menu",true);
mi = new JMenuItem("MenuItem");
m.add(mi);
mb.add(m);
jf1.setJMenuBar(mb);
jb1.addActionListener(this);
jf1.show();
}
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == jb1)
{
System.out.println("Serializing...");
try
{
FileOutputStream ostream;
ObjectOutputStream p;
ostream = new FileOutputStream("test.out");
p = new ObjectOutputStream(ostream);
p.writeObject(jf1);
p.flush();
ostream.close();
}
catch (IOException ie)
{
ie.printStackTrace();
System.exit(0);
}
System.out.println("Serialization complete.");
}
}
}
(Review ID: 96110)
======================================================================
Name: clC74495 Date: 10/06/99
Carlos.Lucasius@Canada (October 6, 1999): regression of bug 4110285?
/***************************************************************************
JMenuBars are damaged by serialization (they can't be serialized twice)
JMenuBars are damaged when they are serialized, such that they can't be
serialized twice in a row. This sample program can be used to
demonstrate the problem; it opens a window with a simple JMenuBar and
a button marked "Serialize".
Run the program and push the "Serialize" button; it seems to be work. But
look closely at the JMenuBar; the border is now missing! It looks like
the border was not properly re-installed at the end of the normal
serialization kludge.
Now press the "Serialize" button again; this time you get a
NullPointerException.
This bug is pretty important if you are building an IDE that supports
visual editing of menus.
This problem happens with this build (but it's been broken for years):
java version "1.3.0"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.0-G)
Java HotSpot(TM) Client VM (build 1.3-G, mixed mode)
This bug can be easily fixed in JMenuBar.java by adding this block of
code to the writeObject method, just after the call to s.defaultWriteObject():
if ((ui != null) && (getUIClassID().equals(uiClassID)))
{
ui.installUI(this);
}
Here is the output from the sample program:
Serializing...
Serialization complete.
Serializing...
Exception occurred during event dispatching:
java.lang.NullPointerException
at javax.swing.LookAndFeel.uninstallBorder(LookAndFeel.java:123)
at javax.swing.plaf.basic.BasicMenuBarUI.uninstallDefaults(BasicMenuBarUI.java:143)
at javax.swing.plaf.basic.BasicMenuBarUI.uninstallUI(BasicMenuBarUI.java:135)
at javax.swing.JComponent.compWriteObjectNotify(JComponent.java:4428)
at javax.swing.JComponent$EnableSerializationFocusListener.writeObject(JComponent.java:4418)
at java.lang.reflect.Method.invoke(Native Method)
at java.io.ObjectOutputStream.invokeObjectWriter(ObjectOutputStream.java:1811)
at java.io.ObjectOutputStream.outputObject(ObjectOutputStream.java:1186)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:362)
at java.awt.AWTEventMulticaster.save(AWTEventMulticaster.java:767)
at java.awt.Component.writeObject(Component.java:4463)
at java.lang.reflect.Method.invoke(Native Method)
at java.io.ObjectOutputStream.invokeObjectWriter(ObjectOutputStream.java:1811)
at java.io.ObjectOutputStream.outputObject(ObjectOutputStream.java:1186)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:362)
at java.io.ObjectOutputStream.outputArray(ObjectOutputStream.java:1074)
at java.io.ObjectOutputStream.checkSubstitutableSpecialClasses(ObjectOutputStream.java:452)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:357)
at java.io.ObjectOutputStream.outputClassFields(ObjectOutputStream.java:1774)
at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:473)
at java.awt.Container.writeObject(Container.java:1859)
at java.lang.reflect.Method.invoke(Native Method)
at java.io.ObjectOutputStream.invokeObjectWriter(ObjectOutputStream.java:1811)
at java.io.ObjectOutputStream.outputObject(ObjectOutputStream.java:1186)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:362)
at java.io.ObjectOutputStream.outputArray(ObjectOutputStream.java:1074)
at java.io.ObjectOutputStream.checkSubstitutableSpecialClasses(ObjectOutputStream.java:452)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:357)
at java.io.ObjectOutputStream.outputClassFields(ObjectOutputStream.java:1774)
at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:473)
at java.awt.Container.writeObject(Container.java:1859)
at java.lang.reflect.Method.invoke(Native Method)
at java.io.ObjectOutputStream.invokeObjectWriter(ObjectOutputStream.java:1811)
at java.io.ObjectOutputStream.outputObject(ObjectOutputStream.java:1186)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:362)
at java.io.ObjectOutputStream.outputArray(ObjectOutputStream.java:1074)
at java.io.ObjectOutputStream.checkSubstitutableSpecialClasses(ObjectOutputStream.java:452)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:357)
at java.io.ObjectOutputStream.outputClassFields(ObjectOutputStream.java:1774)
at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:473)
at java.awt.Container.writeObject(Container.java:1859)
at java.lang.reflect.Method.invoke(Native Method)
at java.io.ObjectOutputStream.invokeObjectWriter(ObjectOutputStream.java:1811)
at java.io.ObjectOutputStream.outputObject(ObjectOutputStream.java:1186)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:362)
at MenuBarTest.actionPerformed(MenuBarTest.java:147)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1244)
at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(AbstractButton.java:1296)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:378)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:250)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:238)
at java.awt.Component.processMouseEvent(Component.java:3677)
at java.awt.Component.processEvent(Component.java:3506)
at java.awt.Container.processEvent(Container.java:1255)
at java.awt.Component.dispatchEventImpl(Component.java:2563)
at java.awt.Container.dispatchEventImpl(Container.java:1304)
at java.awt.Component.dispatchEvent(Component.java:2466)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:2550)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:2315)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:2218)
at java.awt.Container.dispatchEventImpl(Container.java:1291)
at java.awt.Window.dispatchEventImpl(Window.java:872)
at java.awt.Component.dispatchEvent(Component.java:2466)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:322)
at java.awt.EventDispatchThread.pumpOneEvent(EventDispatchThread.java:107)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:97)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:88)
*****************************************************************************/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
public class MenuBarTest implements ActionListener
{
public static void main(String args[])
{
new MenuBarTest();
}
JFrame jf1;
JButton jb1;
JMenuBar mb;
JMenuItem mi;
JMenu m;
public MenuBarTest()
{
jf1 = new JFrame("Test JMenuBar Serialization");
jb1 = new JButton("Serialize");
jf1.setSize(300,100);
jf1.getContentPane().setLayout(new FlowLayout());
jf1.getContentPane().add(jb1);
mb = new JMenuBar();
m = new JMenu("Menu",true);
mi = new JMenuItem("MenuItem");
m.add(mi);
mb.add(m);
jf1.setJMenuBar(mb);
jb1.addActionListener(this);
jf1.show();
}
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == jb1)
{
System.out.println("Serializing...");
try
{
FileOutputStream ostream;
ObjectOutputStream p;
ostream = new FileOutputStream("test.out");
p = new ObjectOutputStream(ostream);
p.writeObject(jf1);
p.flush();
ostream.close();
}
catch (IOException ie)
{
ie.printStackTrace();
System.exit(0);
}
System.out.println("Serialization complete.");
}
}
}
(Review ID: 96110)
======================================================================