四.BDK工具类
从Jar文件的操作到ClassLoader,从Applet类的制作到Bean的Applet封装,从类的编译到辅助信息的显示,从Bean的封装到各种类型的属性编辑器,从封装事件信息到串行化对象的各种操作实现。所以我将工具类进行分类以后再进行分析:
1.Jar文件操作
Jar文件的操作包括:
l JarAccess.java 该类实现了一个简单的使用jar文件格式来创建文件的工具
l JarEntrySource.java 用于请求创建jar文件
l JarInfo.java 代表一个载入的jar文件,包含该文件的信息
l JarLoader.java 读取jar文件的内容
l Manifest.java 代表jar文件的Manifest信息
2.Applet相关
l AppletClassGenerator 为Applet自动产生Applet类代码
l AppletGenerator.java 由组合的Beans产生Applet的jar文件
l MakeAppDlg.java 要求制作Applet的对话框
3.属性编辑器
l PropertyCanvas.java 支持在一个Canvas上画出一个属性值,有三个成员变量,值得注意的是PropertyEditor的一个对象来实现编辑。在public void mouseClicked(MouseEvent evt)方法中使用了PropertyDialog来获取新的设置。
l PropertySelector.java 用来支持属性编辑器的标签选择,同样是使用PropertyEditor的一个对象来实现编辑。
l PropertyText.java 用来支持属性编辑器的文本输入,同样是使用PropertyEditor的一个对象来实现编辑。
l PropertyDialog.java 用一般的编辑器来持属性编辑器。
PropertyHookupManager.java
用来管理属性之间的钩子,以便于一个对象上属性的变化能够传递给和它相关的属性。它有一个成员变量就是Hashtable的一个实例,用来PropertyHookup对象和事件源的映射。
l public synchronized static void attach(Wrapper sourceWrapper, String propertyName, Method getter,
Wrapper targetWrapper, Method setter)
从这个方法的参数就可以看到大概的功能。就是将源时间对象的属性名,方法和目标对象的相应方法相联系。在实现过程使用了PropertyHookup来保存每一对联系。
l PropertyNameDialog.java 属性对话框用来查找一个给定的源对象的属性。
4.Bean的封装
Wrapper.java
用于跟踪在设计窗口的每个Bean在BeanBox中的相关状态,这是BDK的Bean封装中最重要的类。它继承了Panel,实现了Serializable, MouseListener, MouseMotionListener接口。
l public Wrapper(Object bean, String beanLabel, String beanName)首先检查了参数,判断是否是可显示的,如果不可显示,使用OurLabel进行封装成可见的Component;然后加入当前Panel;最后执行初始化方法initialize()和加载事件监听器的方法attachListeners()。
l void initialize()首先再次确保不可见的Bean的不可见性;获取该Bean的所有事件描述;检查目标事件向量是否存在,如果不存在则创建新的目标事件向量和属性目标向量;最后通过目标事件向量获取属性目标向量。
l private Vector getWPEIfromWET(Vector wets)该方法的功能就是通过目标事件向量获取属性目标向量。具体实现是通过列举目标事件向量的每一个事件,取出每个事件的WrapperEventTarget,如果WrapperEventTarget的成员变量targetListener是PropertyHookup的一个实例,那么获得该PropertyHookup对象,由此得到该对象的和这个属性相关的事件PropertyHookupTargets向量,然后封装成WrapperPropertyEventInfo对象的向量集合返回。
l public String getAdderName(String eventSetName)获取事件集合中添加监听器方法的名字
l public String getRemoverName(String eventSetName) 获取事件集合中删除监听器方法的名字
l public WrapperEventInfo[] getEventHookupInfo()获取WrapperEventInfo信息。首先,它统计了钩子信息的总数;然后列举了eventTargets所有的WrapperEventTarget,然后用此创建了WrapperEventInfo数组。又列举了propertyTargets的所有元素,添加新的WrapperEventInfo数据。
l void removeListeners()临时的删除所有的事件监听器。
l void attachListeners()重新加入所有的事件监听器
l void cleanup()当封装类被从BeanBox剪切下来的时候调用
l public void setFromPrototype(boolean b)设置对象是否从序列化中得到
l public Vector getChangedProperties()用于获取设计时期的属性变化的向量
l public Vector getChangedProperties()该静态方法用于映射一个AWT控件到一个与之相联系的封装对象
l public void paint(Graphics g)重写了paint方法
l public synchronized void doMouseStuff(MouseEvent evt)用于处理在移动或者改变大小的时候其鼠标的操作
l final BeanBox getBeanBox()获取BeanBox的实例
l static void showInvisibleBeans(boolean show)设置是否显示不可见的Bean
l public boolean handleEvent(Event evt)用于支持旧式的事件处理
l private static synchronized void getHashBars(Component c)
WrapperEventInfo.java
事件监听器的钩子信息,用来描述封装的事件的具体信息,包括目标Bean,适配器的类名和事件集名字。在构造函数中,需要指明目标Bean,适配器的类名和事件集名字。
WrapperPropertyEventInfo.java
继承了WrapperEventInfo类,用于当连接到一个具体的属性,即使用"sunw.beanbox.PropertyHookup"指定为钩子,"propertyChange"指定为事件集名字。增加了设置者的名字,类性和属性的名字这三个类成员变量。在构造函数中,需要指明目标Bean,属性名字和方法。
l private String initStringFromType(Class[] klass)用于将一个Class对象的数组转换为一个类名的字符串数组
HookupManager.java
管理事件源bean和目标bean的目标方法之间的钩子,将为每一个钩子都产生一个类,作为适配器编译加载到ClassLoader
l EventTargetDialog.java 用来为焦点Bean定制事件的对话框
l Report.java 从一个给定的Bean类提取内部信息的报告
PropertyHookup.java
PropertyHookup类实现了PropertyChangeListener和Serializable接口。它的两个成员变量一个是源对象,一个是和属性名字相应的PropertyHookupTargets对象的向量。
l public void attach用来创建一个属性钩子,以便于绑定了名字的属性的改变能够从源对象转向调用目标对象的设置方法。
l synchronized public void propertyChange(PropertyChangeEvent evt)该方法用于绑定在源对象的属性发生变化时能够调用。我们已经映射了该属性对应一系列目标对象,然后只要调用每一个目标的setter类方法即可。
内部类PropertyHookupTarget用于传递目标信息。实现了Serializable接口,拥有两个成员变量,一个是目标对象,一个是记录setter的Method对象。
l private void writeObject(ObjectOutputStream s)
l private void readObject(ObjectInputStream s)为用于支持串行化的方