WEB开发网
开发学院软件开发Java 创建一种声明性 XML UI 语言:用 Java 语言构建一... 阅读

创建一种声明性 XML UI 语言:用 Java 语言构建一个 UI 和配套框架

 2009-10-19 00:00:00 来源:WEB开发网   
核心提示: GUI 组件 & XML 节点构成在 图 1 中,步骤 5 创建了一个组件模型,创建一种声明性 XML UI 语言:用 Java 语言构建一个 UI 和配套框架(8),支持将这个 XML 节点(现在是内存对象)和一个 GUI 组件组成一对,这种配对需要非常严格地同步以下事件:对于框架读入的每个

GUI 组件 & XML 节点构成

在 图 1 中,步骤 5 创建了一个组件模型,支持将这个 XML 节点(现在是内存对象)和一个 GUI 组件组成一对。这种配对需要非常严格地同步以下事件:

对于框架读入的每个 XUINode(表示任意 XML 元素的内存对象),必须创建一个 XUIComponent 来包围 XUINode。

对于在内存中创建的每个 XUIComponent,必须创建一个 GUI 对等物,比如 javax.swing.JFrame。

每当一个 XUIComponent 实例 — 或它的一个子类型(比如 XUIButton)— 被修改时(比如修改大小),XUIComponent 必须确保 XUINode 和 GUI 对等物同时、同等地更新。

通过满足上述要求,这个框架允许程序员将多个 XML 文档读入内存(解组),修改 DOM,然后将更改保存回一个 XML 文档(编组)。程序员甚至可以以编程方式创建几个新的 DOM 并对它们进行编组。

DOM 节点编组

这个框架提供了一个 toString 方法(见 清单 5),以便 XUINode 将自身编组为 XML。根节点可以包含多个子节点,子节点可以包含自己的子节点,依次类推。通过调用根级别节点的 toString 方法,这个框架可以轻松编组整个 XML 文档。名称空间被添加进来,以便每个元素知道自己在层级中的级别(通过 level 变量)。这样,当 toString 方法被调用时,它可以实现缩进,以使这些文档更易于阅读。

清单 5. XUINode toString 方法实现

@Override 
public String toString() { 
  StringBuffer sb = new StringBuffer(); 
  String namespacePrefix = ""; 
  // insert indenting ... 2 spaces for now. 
  if(isRoot) { 
    sb.append(XMLPI + "\n"); 
    sb.append(API_COMMENT + "\n"); 
  } else { 
    sb.append("\n"); 
    for(int s = 0; s < level; s++) { 
      sb.append(" "); 
    } 
  } 
  sb.append("<"); 
  // get namespaces for this node 
  Enumeration keys = nameSpaces.keys(); 
 
  String names = ""; 
  while(keys.hasMoreElements()) { 
    String uri = (String)keys.nextElement(); 
    String prefix = (String)nameSpaces.get(uri); 
    /* if its the xsi namespace (XML Schema Instance), 
     * ignore it, this isn't part of that namespace but it is 
     * needed for the XML Schema validator to work. */ 
    if(!(prefix.equals("xsi"))) { 
      sb.append(prefix + ":"); 
      namespacePrefix = prefix; 
    } 
    names += (" " + "xmlns:" + prefix + "=\"" + uri + "\""); 
  } 
  if(beginOfNamespace) { 
    sb.append(name + names); 
  } else { 
    sb.append(name); 
  } 
 
  // do attributes if there are any 
  if(attributes.getLength() > 0) { 
    int length = attributes.getLength(); 
    for(int i = 0; i < length; i++) { 
      String attributeValue = attributes.getValue(i); 
      String attributeQName = attributes.getQName(i); 
      sb.append(" " + attributeQName + "=\"" + attributeValue + "\""); 
    } 
  } 
  sb.append(">"); 
  sb.append(cdata); 
  int size = childNodes.size(); 
  for(int i = 0; i < size; i++) { 
    XUINode e = (XUINode)childNodes.get(i); 
    sb.append(e.toString()); 
  } 
  if(size > 0) { 
    sb.append("\n"); 
    for(int s = 0; s < (level); s++) 
      sb.append(" "); 
  } 
  if(namespacePrefix.length() > 0) { 
    sb.append("</" + namespacePrefix + ":" + name + ">"); 
  } else { 
    sb.append("</" + name + ">"); 
  } 
 
  return sb.toString(); 
} 

上一页  3 4 5 6 7 8 9 10  下一页

Tags:创建 声明 XML

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接