You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 00:36:02