I am working on a form editor for a database system. The Form editor
works by allowing the user to add components to a "designPane" that
extends JPanel. After editing the form is saved using an XMLEncoder to
write the entire designPane to XML. This has worked fine up until now.
Ive created a custom component called "DBJCheckedListbox" that extends
Jlist. The error occurs when XMLEncoder tries to encode the
designPane. The relevant stack trace is:
java.lang.Exception: discarding statement
DesignPane0.add(DBJCheckedListbox0);
at java.beans.XMLEncoder.writeStatement(XMLEncoder.java:339)
at java.beans.DefaultPersistenceDelegate.invokeStatement(DefaultPersistenceDelegate.java:242)
at java.beans.java_awt_Container_PersistenceDelegate.initialize(MetaData.java:400)
at java.beans.PersistenceDelegate.initialize(PersistenceDelegate.java:191)
at java.beans.DefaultPersistenceDelegate.initialize(DefaultPersistenceDelegate.java:393)
at java.beans.javax_swing_JComponent_PersistenceDelegate.initialize(MetaData.java:587)
at java.beans.PersistenceDelegate.initialize(PersistenceDelegate.java:191)
at java.beans.DefaultPersistenceDelegate.initialize(DefaultPersistenceDelegate.java:393)
at java.beans.PersistenceDelegate.initialize(PersistenceDelegate.java:191)
at java.beans.DefaultPersistenceDelegate.initialize(DefaultPersistenceDelegate.java:393)
at java.beans.PersistenceDelegate.writeObject(PersistenceDelegate.java:103)
at java.beans.Encoder.writeObject(Encoder.java:55)
at java.beans.XMLEncoder.writeObject(XMLEncoder.java:250)
at java.beans.Encoder.writeExpression(Encoder.java:260)
at java.beans.XMLEncoder.writeExpression(XMLEncoder.java:363)
at java.beans.PersistenceDelegate.writeObject(PersistenceDelegate.java:100)
at java.beans.Encoder.writeObject(Encoder.java:55)
at java.beans.XMLEncoder.writeObject(XMLEncoder.java:250)
at java.beans.Encoder.writeObject1(Encoder.java:192)
at java.beans.Encoder.cloneStatement(Encoder.java:205)
at java.beans.Encoder.writeStatement(Encoder.java:236)
at java.beans.XMLEncoder.writeStatement(XMLEncoder.java:326)
at java.beans.XMLEncoder.writeObject(XMLEncoder.java:253)
at com.summationtech.symmetry.client.Modules.browser.FormEditor.DesignPane.save(DesignPane.java:133)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at com.demmegod.Thread.ReflectionThread.run(ReflectionThread.java:101)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 2
at java.beans.DefaultPersistenceDelegate.initBean(DefaultPersistenceDelegate.java:340)
at java.beans.DefaultPersistenceDelegate.initialize(DefaultPersistenceDelegate.java:395)
at java.beans.PersistenceDelegate.writeObject(PersistenceDelegate.java:103)
at java.beans.Encoder.writeObject(Encoder.java:55)
at java.beans.XMLEncoder.writeObject(XMLEncoder.java:250)
at java.beans.Encoder.writeExpression(Encoder.java:260)
at java.beans.XMLEncoder.writeExpression(XMLEncoder.java:363)
at java.beans.PersistenceDelegate.writeObject(PersistenceDelegate.java:100)
at java.beans.Encoder.writeObject(Encoder.java:55)
at java.beans.XMLEncoder.writeObject(XMLEncoder.java:250)
at java.beans.Encoder.writeObject1(Encoder.java:192)
at java.beans.Encoder.cloneStatement(Encoder.java:205)
at java.beans.Encoder.writeStatement(Encoder.java:236)
at java.beans.XMLEncoder.writeStatement(XMLEncoder.java:326)
... 28 more
Oddly enough this doesn't happen all the time but i haven't been able
to figure out why. Any ideas on what would make this happen?
The API for the DBJCheckedListbox class is as follows (I don't see how
this would help much, but cant hurt)
public class DBJCheckedListbox extends JList implements
symmDBJComponent, MouseListener
private boolean live = false;
private String relation;
private exceptionDispatcher ExceptionDispatcher;
private node relationBase;
private checkListModel mdl;
private checkBoxListCellRenderer cellRend;
public DBJCheckedListbox()
public DBJCheckedListbox(boolean live)
public void enableEditing()
public void disableEditing()
public void reload()
public void saveData()
public void setNode(node Node)
public void setNode(long nodeID)
public void load()
public node getNode()
public void setExceptionDispatcher(exceptionDispatcher eD)
public exceptionDispatcher getExceptionDispatcher()
public String getComponentName()
public void deleteNode()
public void setJSScriptable(Scriptable scope)
public void setObjectTypeEditable(boolean b)
public void setRelationBase(node baseNode)
public void setRelationBase(long baseNodeID)
public void setRelationObject(String relatedName)
public String getRelationObject()
public int getDataType()
public boolean isLive()
public void setLive(boolean live)
private void postException(Exception e)
public void mouseClicked(MouseEvent e)
public void mouseEntered(MouseEvent e)
public void mouseExited(MouseEvent e)
public void mousePressed(MouseEvent e)
public void mouseReleased(MouseEvent e)
Thanks in advance.
LeeMeador - 04 Jun 2004 00:15 GMT
The problem may be that you sometimes a class is not considered to be bean
if there are more than one setter with the same name. Some code cares.
Some doesn't.
In your class you have these methods:
public void setNode(node Node)
public void setNode(long nodeID)
public node getNode()
The XML encoder may be having trouble deciding if the 'node' property is a
long or a node. There may be similar problems on other attributes.
The solution is to have a single setter and a single getter for each
property and the argument on the setter must match the return from the
getter as to type.
I would rename the 'setNode(long)' method to be 'setNodeAsLong()' knowing
as little as I do about what your code does.
I hope this helps.