辅助类的自动映射
我们知道在 java 的反射功能,为自动映射提供了可能性。从实际应 用中,可以判断,在界面辅助类中,需要映射的都是控件类型,都派生自 JComponent 类,我们可以遍历所有定义的 Java 成员,如果其类型为 Swing 界面控件类型,则从 GUIEngine 中提取相应的界面组件并进行成员赋值。当然为能够正确地完 成界面组件自动映射的条件是:界面组件的名称要与界面辅助类中定义的 public 成员名称保持一致。实现方法很简单,如 下面代码所示:
清单 5. 辅助类自动映射实现关键代码清单
private void reflectComponents(GUIEngine
ge){
/* 遍历类所有的属性 */
Field[] fields = getClass().getFields();
try {
for (int i = 0; i < fields.length; i++) {
Type type=fields[i].getType();
String tmPStr=type.toString();
if (tmpstr.indexOf("javax.swing")!=-1){
fields[i].set(this ,ge.getComponentByName(fields[i].getName()));
}
}
} catch (Exception iae) {
iae.printStackTrace();
}
}
由于这个方法对所有的辅助类都是公用的方法,所以可以抽象一个父类 UIHelp,在构造函数中,完成控件 属性的自动映射功能。在每个界面辅助类中的 getAllComponents() 方法可以取消了,代码更为的简洁。给出 UIHelp 的代 码:
清单 6. 优化后的 UIHelp 类实现代码清单
public class UIHelp {
public static T getInstance(
GUIEngine ge,Class cls){
T help=(T)ge.getGUIHelpMap().get(cls.getName());
try {
if (help==null ){
help=cls.newInstance();
help.reflectComponents(ge,cls);
String clsname= help.getClass().getName();
ge.getGUIHelpMap().put(clsname, help);
}
}catch (InstantiationException il){
}catch (IllegalAccessException ie){}
return help;
}
private void reflectComponents(GUIEngine ge,Class cls){
// 该代码前面已经给出,这里不重复了。
}
}
上面代码分下面几步:
在 GUIEngine 实例中,判断是否创建有该界面对应的辅助类;
因为所有的辅 助类都是 UIHelp 的子类,所以通过泛型的方法返还的也是 UIHelp 的子类,传递的 Class 也是该子类,不用再单独进行 类型转换的判断;
自动完成对传递进来的 辅助类的界面控件的自动映射;
将创建的辅助类,附着在 GUIEngine;
上述辅助类的代码就非常简单了:
清单 7. 清单 1 描述的界面的辅助类的实现
public class
UPSTypeHelper extends UIHelp {
public JButton btnOk;// 确定按钮
public JButton btnCancel;// 取消按钮
public JTextField txttest;// 文本框
public JLabel labeltest ;// 文本标签
public UPSTypeHelper getInstance(GUIEngine ge){
return getInstance (ge,UPSTypeHelper.class );
}
}
只需要在辅助类中,定义好控件类为 public 类型,调用 getInstance 就可以自动在父类中完成映射功能了。
功能的扩展
根据下面的示意图和上面的代码我们可以看出,一个 GUIEngine 其实不只可以附着一个辅助类 ,因为定义了一个 HashMap 来存放辅助类的实例,我们只要保证实例的名称不一样就可以了,这样我们可以用几个辅助类 来映射界面类。在配置数据的界面中,当字段非常多的时候,而且字段有明显的分类比如通过 Tab 页的形式,防止辅助类 过大,可以定义多个辅助类来完成。
界面引擎与辅助类的映射关系示意图
另外一种情况是,辅助类其实也可以复用, 当界面大部分相同时,我们可以对一些经常使用到的控件,创建公用的界面助手类。每个界面助手类只映射 GUIEngine 对 象的一部分界面控件,则助手类可以被更广泛地重用
¥29.00
¥498.00
¥399.00
¥299.00