假设你希望在程序退出是保存画线的结果。
先修改class MyCanvas如下:
class MyCanvas extends Canvas implements Serializable{
//…………具体内容
}然后修改class Draw如下:
class Draw extends Frame {

MyCanvas canvas=new MyCanvas();
         File file = new File("temp.tmp");
         FileInputStream fileStream=new FileInputStream(file));//对象保存在文件temp.tmp中
         ObjectInputStream in = new ObjectInputStream(fileStream);//对象保存在文件temp.tmp中
         canvas=(MyCanvas)in.readObject(this.canvas);//读取对象
         file.delete();//删除上次保存的文件
public Draw() {
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
                                     ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("temp.tmp"));//定义对象保存在文件temp.tmp中
                                    out.writeObject(this.canvas);//保存对象 System.exit(0);
}
});
this.add(canvas);
 
} public static void main(String args[]) {
System.out.println("Starting Draw...");
Draw mainFrame = new Draw();
mainFrame.setSize(800, 600);
mainFrame.setTitle("Draw");
mainFrame.setVisible(true);
}
}
这样,上次画了的图像,就会在每次打开程序时,显示上次退出时的图像了。
还有记住要在java文件中加上
import java.io.*;

解决方案 »

  1.   

    噢!对不起,上面的答案有一个地方写错了。下面的才是正确的!
    假设你希望在程序退出是保存画线的结果。
    先修改class MyCanvas如下:
    class MyCanvas extends Canvas implements Serializable{
    //…………具体内容
    }然后修改class Draw如下:
    class Draw extends Frame {

    MyCanvas canvas=new MyCanvas();
             File file = new File("temp.tmp");
             FileInputStream fileStream=new FileInputStream(file));//对象保存在文件temp.tmp中
             ObjectInputStream in = new ObjectInputStream(fileStream);//对象保存在文件temp.tmp中
             canvas=(MyCanvas)in.readObject();//读取对象
             if(file.exists()){
                file.delete();//删除上次保存的文件
             }
    public Draw() {
    addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
    dispose();
                                         ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("temp.tmp"));//定义对象保存在文件temp.tmp中
                                        out.writeObject(this.canvas);//保存对象 System.exit(0);
    }
    });
    this.add(canvas);
     
    } public static void main(String args[]) {
    System.out.println("Starting Draw...");
    Draw mainFrame = new Draw();
    mainFrame.setSize(800, 600);
    mainFrame.setTitle("Draw");
    mainFrame.setVisible(true);
    }
    }
    这样,上次画了的图像,就会在每次打开程序时,显示上次退出时的图像了。
    还有记住要在java文件中加上
    import java.io.*;如果想要跟多的了解,你也可以看看《thinking in java》这本书关于io的一章的对象序列化部分。
      

  2.   

    implements Serializable到底有什么用途,用在什么地方,高手请赐教啊!
      

  3.   

    我把jdk 的文档打开看了一下,因为本人e文不是很好,好后是懂非懂的,请高人指点
      

  4.   

    Java 对象序列化规范 
    --------------------------------------------------------------------------------
    1.5 定义类的可序列化域
    可用两种不同的方式来定义类的可序列化域。类的可序列化域被缺省定义为非瞬态和非静态域。 通过在 Serializable 类中声明一个指定的域 serialPersistentFields,即可覆盖该缺省值。 该域的初始化必须用 ObjectStreamField 对象的数组来完成,该对象列出了可序列化域的名称和类型。该域的修饰符应为 private、static 和 final。
    例如,以下声明将复制缺省行为。
    class List implements Serializable {
        List next;
        private static final ObjectStreamField[] serialPersistentFields
                     = {new ObjectStreamField("next", List.class)};}
    用 serialPersistentFields 为某个类定义可序列化域后,即无需再将可序列化域限制在当前 Serializable 类的定义之内。利用第 1.7 节,"访问类的可序列化域" 中描述的接口,Serializable 类的 writeObject 和 readObject 方法可将该类的当前实现映射到其可序列化域。因此,后续版本中可以改变 Serializable 类的域,但前提是保持与版本兼容的 Serializable 域的映射。1.6 对类的可序列化域和数据存档
    对类的可序列化状态进行存档以使其与 Serializable 类的其它实现间可互操作,或者对类演变进行存档,这些都非常必要。对可序列化域进行存档可帮助用户最终确定该域是否应序列化。 序列化 javadoc 标记 @serial、@serialField 和 @serialData 可提供对源代码中 Serializable 类的序列化形式进行存档的方法。对于缺省的可序列化域,@serial 标记应放在 javadoc 注释中。语法如下:@serial field-description 其中可选项 field-description 描述域及其容许值的含义。 field-description 可跨多行。当初始版本中增加一个域时,@since 标记指出所添域的版本。@serial 的 field-description 提供针对序列化的文档。在序列化形式文档内,field-description 将被添加到 javadoc 注释中。 
    @serialField 标记用于对 serialPersistentFields 数组的 ObjectStreamField 组件进行存档。每个 ObjectStreamField 组件都应使用其中的一个标记。语法如下:@serialField field-name field-type field-description 
    @serialData 标记描述写入或读取数据的次序和类型。该标记描述 writeObject 所写入的可选数据或 Externalizable.writeExternal 方法所写入的所有数据的次序或类型。语法如下:@serialData data-description 
    javadoc 应用程序识别序列化 javadoc 标记并为每个 Serializable 和 Externalizable 类生成说明文字。有关这些标记用法的示例,参见第 C.1 节 "java.io.File 可替代实现的示例。"当某个类被声明为 Serializable 时,即通过可序列化域及可选数据(按名称和类型)定义了该对象的可序列化状态。可选数据只能用 Serializable 类中的 writeObject 方法显式写入,而其读取则可通过 Serializable 类和 readObject 方法进行。否则,序列化将跳过无法读取的可选数据。 当一个类被声明为 Externalizable 时,通过类自身写入流的数据即定义了该类的序列化状态。 该类必须指定顺序、类型及写入流的每个数据的含义。同时还必须处理其自身的演变,从而可读取以前版本所写入的数据,或写入以前版本所能读取的数据。在存储和恢复数据时,该类必须与父类相一致。必须指定流中父类数据的位置。类的设计者必须确保为类存储的信息对于持久性是合适的,而且遵循为实现序列化的互操作性和演变而指定的序列化规则。第 5 章“可序列化对象的版本演变”对类的演变进行了更详细的说明。 1.10 Serializable 接口
    Serialization 对象生成流,其中提供有关所存对象的 JavaTM 类的信息。对于可序列化对象,即使存在该类的不同(但兼容)版本的实现,也要保持足够的信息以恢复这些对象。定义 Serializable 接口可以标识实现可序列化协议的类:
    package java.io;public interface Serializable {};Serializable 类必须具备如下功能:实现 java.io.Serializable 接口 
    标识应序列化的域
    (使用 serialPersistentFields 成员以显式声明其可序列化,或者使用瞬态关键字来指示非序列域。) 
    可访问其第一个非序列化父类的无参数构造函数。 
    该类可根据需要定义如下方法:writeObject 方法,用于控制要保存哪些信息或将附加信息添加到流中 
    readObject 方法,用于读取由相应 writeObject 方法写入的信息,或在对象恢复后更新其状态 
    writeReplace 方法,用于允许类指定写入流的替换对象
    (有关详细信息,参见第 2.5 节,“writeReplace 方法”。) 
    readResolve 方法,用于允许类为刚从流中读取的对象指定替换对象
    (有关详细信息,参见第 3.6 节,“readResolve 方法”。) 
    ObjectOutputStream 和 ObjectInputStream 支持所操作的可序列化类的演变(允许类发生改变以兼容早期版本的类)。有关实现兼容变化的机制的信息,参见第 5.5 节“兼容的 JavaTM 类型演变”。
      

  5.   

    你应该把图像画到Panel里边
    而不应该直接画在Frame里边,没有Panel是放不进去东西的