假设你希望在程序退出是保存画线的结果。
先修改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.*;
先修改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.*;
解决方案 »
- 关于FilenameFilter的一个问题,为何无法过滤非当前文件夹中的文件夹
- 如何算出一个数组中相同数据的个数?
- 请问各位,这句话什么意思???关于继承
- System.out.println(new Date() );疑问
- Swing下面怎么在文本区域加入表格?
- 请问有java中文帮助吗?
- 如果通过反射得到static final 字段的对象,需要对Java有一定的深入了解
- 如何把java的应用程序作为nt service?
- 我用JBuilder的XYLayout,比较爽,可是离开了JBuilder环境就不行了,怎么办?
- 高分求助,weblogic+jb5问题
- 为什么每次我离开这个窗口,再回来他会变花,有什么办法解决
- 真幸运!在图书馆借到好书了!(散分)
假设你希望在程序退出是保存画线的结果。
先修改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的一章的对象序列化部分。
--------------------------------------------------------------------------------
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 类型演变”。
而不应该直接画在Frame里边,没有Panel是放不进去东西的