寄生型设计模式在Swing应用开发中的实践(2)

    作者:课课家教育更新于: 2016-02-03 15:37:22

    大神带你学编程,欢迎选课

      程序调 用逻辑如下:

      请单 2. 根据描述文件创建界面程序清单

      /* 创建一个主程序框架 */

    寄生型设计模式在Swing应用开发中的实践(2)_java__Java界面_课课家

      JFrame jf=new JFrame("test");

      /* 传递界面描述文件,初始化界面引擎实例 */

      GUIEngine ge=new GUIEngine("Outdoor_UPS.XML");

      ge.createJDialog(jf, "hello world!!").setVisible(false);

      界面辅助类

      但在实际使用过程中,基于我 们已有的开发习惯,我们会发现如果您要访问里面的具体控件就不是那么方便了。您需要通过界面引擎提供的接口来实现 getComponentByName(String name),其实现逻辑就是在创建界面时将所有的界面控件以控件名称为关键字存放在一个 HashMap 中,获取控件就是从存放所有控件的 HashMap 读取出来。

      以上面程序为例,我们在 XML 界面文件中定义 了一个控件名称为“txttest”,此时我是不能直接用 ge.txtest 的方式来访问的,我只能通过调 GUIEngine 实例提供的 接口来完成,ge.getComponentByName(“txttest”),而且获取后的对象其类型信息已经丢失了,必须要用强制类型转换为 javax.swing.JTextField 才能使用。按此种方法访问的缺点是显而易见的:

      1、从 GUIEngine 实例中获取的控件对 象丢失了类型;

      2、另一个问题是需要使用字符串作为关键字从 HashMap 中出错时,由于没有 Java 的编译类型的 检查过程,不容易发现错误。

      为解决上述问题,在实践过程中出于使用习惯的,通常会针对每一个界面都会构建一 个辅助类。在辅助类中直接定义各种界面定义的各种类型的组件的 public 成员,并在辅助类中提供一个静态方法用于根据 GUIEngine 生成一个辅助类。在需要对界面控件访问时,直接使用辅助类的成员进行访问。在辅助类中调用 GUIEngine 的 方法获取组件并赋给辅助类中的成员对象,在其他地方就可以避免调用 getComponentByName 方法来访问界面控件了。

      以上面界面为例:

      清单 3. 界面辅助类的实例

      /**

      * 增加、修改 UPS TYPE 数据的操作方法。

      */

      public class UPSTypeHelper {

      public JButton btnOk;// 确定按钮

      public JButton btnCancel;// 取消按钮

      public JTextField txttest;// 文本框

      public JLabel labeltest ;// 文本标签

      /**

      * 本类的实例对象池。 key:界面描述文件名。 value:类实例。

      */

      private static HashMap instancePool = new HashMap();

      /**

      * 当前界面引擎

      */

      private GUIEngine guiEngine = null;

      private UPSTypeHelper (GUIEngine guiEngine) {

      this.guiEngine = guiEngine;

      this.getAllComponents();

      }

      /**

      * 通过 GUIEngine 获取界面上的所有组件对象。

      */

      private void get All Components () {

      txttest = (JTextField) this.guiEngine.jcmset.get("txttest");

      btnOk=(JButton) this.guiEngine.jcmSet.get("btnOk");

      btnCancel=(JButton) this.guiEngine.jcmSet.get("btnCancel");

      labeltest=(JLabel) this.guiEngine.jcmSet.get("labeltest");

      }

      /**

      * 采用单例模式,保证只创建一次同样的界面对应的辅助类

      */

      public static UPSTypeHelper getInstance(GUIEngine guiEngine) {

      /* 获取该界面引擎对应的 xml 界面描述文件 */

      String guifile = guiEngine.getXmlfile();

      UPSTypeHelper instance = (UPSTypeHelper) instancePool.get(guifile );

      if (instance == null) {

      instance = new UPSTypeHelper (guiEngine);

      instancePool .put(guifile , instance);

      }

      return instance;

      }

      /**

      * 清除使用过的实例。

      */

      public static void removeInstance(String guifile ) {

      if (instancePool .get(guifile ) != null) {

      instancePool .remove(guifile );

      }

      }

      }

      这种辅助类与每一个界面 XML 文件 ( 实际上是根据 XML 文件生成的 GUIEngine 对象 ) 一一对应。即每画一 个界面 XML 文件都需要创建一个界面助手类。

课课家教育

未登录

1