Updated 2014/03/27 P402-P454
世界三大首席管理器: border, flow, box
borderLayout: 五个区(东、西、北、南、*)
FlowLayout:水平顺序排列,放不下换行
BoxLayout:按某个轴垂直排列
1.可以调用setLayout来改变面板的布局管理器,setLayout(null)直接定位画面位置和大小,但使用布局管理器还是比较好的方式
2.BorderLayout布局可以让你把组件加到五个区域上。你必须以下列语法来指定区域:
add(BorderLayout.EAST,panel);
3.BorderLayout布局上的南北区域使用组件的理想高度而不管宽度,东西区域刚好相反,中间区域只能使用剩下的空间
4.pack()方法会使window的大小符合内含组件的大小
5.FlowLayout布局会由左至右、由上至下依次加入的顺序来安置组件,若宽度超过时就会换行。FlowLayout布局会让组件在长宽上都使用理想的尺寸大小。
6.BoxLayout布局让你可以垂直地排列组件,如同FlowLayout布局一样,它会让组件在长宽上都使用理想的尺寸大小。
7.框架默认时使用BoxLayout布局,面板默认使用FlowLayout布局。
如何储存对象状态---通过序列化
一.如果只有自己写的Java程序会用到这些数据:
a) 用序列化(serialization)。将被序列化的对象写到文件中。然后就可以让你的程序去文件中读取序列化的对象并把它们展开回到活生生的状态
二.如果数据需要被其他程序引用:
a) 写一个纯文本文件。用其他程序可以解析的特殊字符写到文件中。例如写成用tab字符来分隔的档案以便让电子表格或数据库应用程序能够应用。
一般来说,串流要两两连接才能作出有意义的事情----其中一个表示连接,另一个则是要表示调用方法的。为何要两个?因为连接的串流通常都是很低层的。以FileOutputStream为例,它有可以写入字节的方法。但我们通常不会直接写字节,而是以对象层次的观点来写入,所以需要高层的连接串流。
那又为何不以单一的串流来执行呢?这就要考虑到良好的面向对象设计了。每个类只要做好一件事。FileOutputStream把字节写入文件。ObjectOutputStream把对象转换成可以写入串流的数据。当我们调用ObjectOutputStream的writeObject时,对象会被打成串流送到FileOutputStream来写入文件。
创建出FileOutputStream链接到ObjectOutputStream以让它写入对象
FileOutputStream fs = new FileOutputStream(“foo.ser”);
ObjectOutputStream os = new ObjectOutputStream(fs);
os.writeObject(myFoo);
os.close();
如果要让类能够被序列化,就实现Serializable
如果类中的某实例变量不能或不应该被序列化,就把它标记为transient(瞬时)的。
解序列化(Deserialization):还原对象
FileInputStream fs = new FileInputStream(“MyGame.ser”);
ObjectInputStream os = new ObjectInputStream(fs);
Object one = os.readObject();
GameCharacter elf = (GameCharacter) one;
os.close();
解序列化步骤:
- 对象从stream中读出来。
- Java虚拟机通过存储信息判断出对象的class类型
- Java虚拟机尝试寻找和加载对象的类。
- 新的对象会被配置在堆上,但构造函数不会执行!
- 如果对象在继承树上有个不刻序列化的祖先类,则该不刻序列化类以及在它之上的类的构造函数(就算是可序列化也一样)都会被执行。
- 对象的实例变量会被还原成序列化时点的状态值。Transient变量会被赋值null的对象引用或primitive主数据类型的默认为0、false等值。
对象必须实现序列化这个接口才能被序列化。如果父类实现序列化,则子类也就自动地有实现,而不管是否有明确的声明。
静态变量不会被序列化,因为所有对象都是共享同一份静态变量值。
写序列化的对象
ObjectOutputStream.writeObject(someObject);
写字符串
fileWriter.write(“My first String to save”);
BufferedWriter writer = new BufferedWriter(new FileWriter(aFile));
缓冲区能让你暂时摆一堆东西一直到满为止。用了缓冲区就可以省下好几趟的来回。
强制缓冲区立即写入: writer.flush();