在 Swing 中序列化模型时 ToolkitImage 出现 NotSerializedException

发布于 2024-11-18 14:05:53 字数 1418 浏览 4 评论 0原文

我有操纵形状的 Swing 应用程序。在我的工具栏中,我有一个缩放功能,用户可以通过单击按钮来激活该功能,然后鼠标光标变为图像放大器。 我的问题实际上是光标,出于某些原因,当我将光标设置在显示形状的面板上时,我无法保存模型,并且得到 java.io.NotSerializedException: 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); 的标准 Java 方法,

谢谢

I have Swing application which manipulate shapes. In my toolbar I have a zoom function that the user activate by clicking on a button, then the cursor of the mouse changes to a magnifier which is an image.
My problem is actually the cursor, for some raisons, when I set the cursor on the panel displaying the shapes, I can't save my model and I get the java.io.NotSerializableException: sun.awt.image.ToolkitImage exception.

My model

public class Document implements IDocObservable,Serializable{

...

public void updateCursor() {
    Iterator<IDocObserver> iter = docObservers.iterator();
    while (iter.hasNext()) {
        iter.next().docCursorChanged();
    }
}
... 

}

The action

public class ZoomInAction extends AbstractAction {


public void actionPerformed(ActionEvent arg0) {
    ...
    Application.getInstance().getActiveDocument().updateCursor();
}

}

The display Panel (note : if I comment the setCursor(..) line, I'am able to save )

public class Window extends JPanel implements IDocObserver{
...

public void paint(Graphics g){          
    //drawing the differents shapes
}

@Override

public void docCursorChanged() {        
    setCursor(Utile.getZoomInCursor();
    }
}

}

The class that provide the cursor

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, ""); 
}

}

The writing of the object is a standard Java methode with outStream.writeObject(doc);

thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

青衫儰鉨ミ守葔 2024-11-25 14:05:53

您不仅序列化模型,还序列化 IDocObserver 列表,其中包括 Window 扩展 JPanel 实现 IDocObserver。 IOW 您正在序列化 JPanel。不要这样做:请参阅 Javadoc 顶部的警告。当然,您不需要将观察者与可观察者一起保存:您不能使该列表暂时存在吗?

You aren't just serializing a model, you are serializing a list of IDocObservers, which includes Window extends JPanel implements IDocObserver. IOW you are serializing a JPanel. Don't do that: see the warning at the top of the Javadoc. You don't need to save the observers along with the observable, surely: can't you make that list transient?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文