我有Swing应用程序来操作形状。在我的工具栏中,我有一个缩放功能,用户通过单击按钮激活,然后鼠标的光标变为放大镜,这是一个图像。
我的问题实际上是光标,对于某些raisons,当我将光标设置在显示形状的面板上时,我无法保存我的模型,我得到java.io.NotSerializableException: sun.awt.image.ToolkitImage
异常。
我的模特
public class Document implements IDocObservable,Serializable{
...
public void updateCursor() {
Iterator<IDocObserver> iter = docObservers.iterator();
while (iter.hasNext()) {
iter.next().docCursorChanged();
}
}
...
}
行动
public class ZoomInAction extends AbstractAction {
public void actionPerformed(ActionEvent arg0) {
...
Application.getInstance().getActiveDocument().updateCursor();
}
}
显示面板(注意:如果我评论setCursor(..)
行,我可以保存)
public class Window extends JPanel implements IDocObserver{
...
public void paint(Graphics g){
//drawing the differents shapes
}
@Override
public void docCursorChanged() {
setCursor(Utile.getZoomInCursor();
}
}
}
提供光标的类
public class Utile {
private static Image zoomIn = toolkit.getImage(Utile.class.getResource("/images/zoomin_mouse.png"));
...
public static Cursor getZoomInCursor() {
return toolkit.createCustomCursor(zoomIn, hotSpot, "");
}
}
对象的编写是带有outStream.writeObject(doc);
感谢
答案 0 :(得分:1)
您不只是序列化模型,而是序列化IDocObservers列表,其中包括Window extends JPanel实现的IDocObserver。你是否正在序列化JPanel。不要这样做:请参阅Javadoc顶部的警告。你不需要将观察者与观察者一起保存:你不能让那个列表成为瞬态吗?