mxGraph中如何使用Java对象作为mxCell用户对象替代XML节点
你的实现逻辑存在偏差:手动对单个对象编解码再存入cell的操作完全多余。mxCodec相关的注册逻辑是为了让mxGraph在全局做模型和XML格式互转的时候可以正确识别你的自定义Java类,内存中运行时可以直接存储原生Java对象作为mxCell的value,不需要做XML节点转换。
正确实现流程
1. 定义自定义用户对象类
自定义类需要放在固定包下,且必须包含无参构造方法、对应属性的getter/setter,可选重写toString方法控制节点显示文本:
package com.example; public class CustomUserObject { // 自定义属性 private String nodeId; private String nodeContent; // 必须保留无参构造,供mxObjectCodec反射调用 public CustomUserObject() {} public CustomUserObject(String nodeId, String nodeContent) { this.nodeId = nodeId; this.nodeContent = nodeContent; } // 必须提供属性对应的getter和setter,编解码器需要读写属性 public String getNodeId() { return nodeId; } public void setNodeId(String nodeId) { this.nodeId = nodeId; } public String getNodeContent() { return nodeContent; } public void setNodeContent(String nodeContent) { this.nodeContent = nodeContent; } // 可选:重写toString方法,返回值就是画布上节点显示的文本 @Override public String toString() { return nodeContent; } }
2. 全局注册包和自定义类编解码器
在mxGraph实例初始化阶段执行一次即可,无需重复调用:
// 注册自定义类所在的包名 mxCodecRegistry.addPackage("com.example"); // 注册自定义类对应的对象编解码器 mxCodecRegistry.register(new mxObjectCodec(new CustomUserObject()));
3. 插入带自定义对象的顶点
直接传入Java对象作为insertVertex的value参数即可,不需要手动编码:
CustomUserObject myObj = new CustomUserObject("user001", "自定义节点"); // 直接传入自定义对象,不需要转XML节点 mxCell newCell = (mxCell) graph.insertVertex(parent, null, myObj, 100, 100, 120, 60, "");
4. 读取cell中的自定义对象
直接从cell取值强转即可,不需要手动解码:
mxCell cell = // 从graph模型中获取的目标cell CustomUserObject obj = (CustomUserObject) cell.getValue(); // 可直接访问自定义属性 System.out.println(obj.getNodeId());
编解码场景使用说明
只有当你需要将整个图模型导出为XML、或者从XML导入恢复模型的时候,才需要调用mxCodec做全局处理,这时候你注册的编解码器会自动完成所有自定义对象和XML节点的转换,无需单独处理每个cell的value:
// 导出模型为XML示例 mxCodec exportCodec = new mxCodec(); org.w3c.dom.Node root = exportCodec.encode(graph.getModel()); String graphXml = mxUtils.getXml(root); // 从XML恢复模型示例 Document xmlDoc = mxUtils.parseXml(graphXml); mxCodec importCodec = new mxCodec(xmlDoc); importCodec.decode(xmlDoc.getDocumentElement(), graph.getModel()); // 恢复完成后,所有cell的value会自动转为CustomUserObject实例
内容的提问来源于stack exchange,提问作者Guglielmo Fratticioli
相关产品推荐
相关产品推荐

