轻松上手 mxGraph 的部分代码示例
最编程
2024-08-07 12:06:55
...
- 使用前准备
mxBasePath变量用来定义库资源的目录。这个变量必须在加载库前就定义好。
<script type="text/javascript"> mxBasePath = 'javascript/src/'; </script> //mxClient.js包含该类库的全部所需代码。 <script type="text/javascript" src="/js/mxClient.js"></script>
- 检查浏览器是否支持
if (!mxClient.isBrowserSupported()) { //如果浏览器不支持,则显示错误信息 alert('该浏览器不支持'); }
- Container 容器
页面用一个dom节点将graph与javascript结合。它可以使用document.getElementById在body中取得或者直接动态创建(如createElement, )。
var container = document.getElementById('id-of-graph-container'); //创建Graph对象 var graph = new mxGraph(container);
- 部分基础属性
graph.setCellsResizable(false); //节点不可改变大小 mxGraphHandler.prototype.setMoveEnabled(true); //是否可以移动 mxGraphHandler.prototype.guidesEnabled = true; //显示细胞位置标尺 graph.setEnabled(false);//是否只读
graph.setConnectable(false);//cell是否可以连线
graph.setCellsLocked(true);//是否可以移动连线,重新连接其他cell,主要用来展现中用
graph.setConnectable(true); // 是否允许Cells通过其中部的连接点新建连接,false则通过连接线连接 /*禁用节点双击,防止改变数据 */ graph.dblClick = function (evt, cell) { var model = graph.getModel(); if (model.isVertex(cell)) { return false; } }; // 节点是否解析html graph.setHtmlLabels(true); // 连线的样式 var style = graph.getStylesheet().getDefaultEdgeStyle(); style[mxConstants.STYLE_ROUNDED] = true;//圆角连线 style[mxConstants.STYLE_EDGE] = mxEdgeStyle.ElbowConnector; //自己拐弯的连线
- 部分方法
getCellAt(x,y,parent,vertices,edges)
//单击事件
graph.click = function (me) {
var x = me.graphX;
var y = me.graphY;
var graph = this.GetmxGraph();
var model = graph.getModel();
var cell = graph.getCellAt(x, y);
if (model.isVertex(cell)) {
alert("环节ID:" + cell.id);
} else {
return false;
}
}
//添加双击事件 graph.addListener(mxEvent.DOUBLE_CLICK, function(sender, evt) { var cell = evt.getProperty('cell'); mxUtils.alert('Doubleclick: '+((cell != null) ? 'Cell' : 'Graph')); evt.consume(); });
//删除选中Cell或者Edge
var keyHandler = new mxKeyHandler(graph);
keyHandler.bindKey(46, function (evt) {
if (graph.isEnabled()) {
graph.removeCells();
}
});
- 添加节点和连接线
程序需要在beginUpdate和endUpdate中来插入节点和连线(更新图形)。endUpdate应放在finally-block中以确保endUpdate一直执行。但beginUpdate不能在try-block中,这样如果beginUpdate失败那么endupdate永远不会执行。
beginUpdate和endUpdate方法不仅提供了显示功能,而且它能够当做undo/redo标记的边界(也就是说,beginUpdate和endUpdate之间操作会作为undo、redo的原子操作,要么同时被redo或undo, 相当于数据库中的事务)。
var parent = graph.getDefaultParent(); graph.getModel().beginUpdate(); try { //参数:节点显示的内容、X、Y、宽度、高度,X、Y是相对于DOM节点中的位置 var v1 = graph.insertVertex(parent, null, '节点一', 20, 100, 300,145, 'rounded;strokeColor=none;fillColor=none;'); var v2 = graph.insertVertex(parent, null, '节点二', 20, 400, 300, 145, 'rounded;strokeColor=none;fillColor=none;'); //圆形节点 var v3 = graph.insertVertex(parent, null, 'B', 80, 100, 100, 100, 'shape=ellipse;perimeter=ellipsePerimeter'); //三角形节点 var v4 = graph.insertVertex(parent, null, 'C', 190, 30, 100, 60, 'shape=triangle;perimeter=trianglePerimeter;direction=south'); //节点是否可以折叠 graph.getModel().setCollapsed(v2, 1); var html = '<div>html</div>'; //更新节点显示的内容 graph.getModel().setValue(v1, html); //连接线,连接线上显示的内容,连接的两个节点,连接线的样式 var e1 = graph.insertEdge(parent, null, '我1连2', v1, v2, "strokeWidth=3;labelBackgroundColor=white;fontStyle=1"); //直角连线 var e2 = graph.insertEdge(parent, null, '', v1, v2, 'edgeStyle=orthogonalEdgeStyle;'); //曲折连线 var e2 = graph.insertEdge(parent, null, '', v3, v2, 'edgeStyle=elbowEdgeStyle;elbow=horizontal;orthogonal=0;entryPerimeter=1;'); //虚线连线 graph.insertEdge(parent, null, null, step1, step2, 'crossover'); } finally { graph.getModel().endUpdate(); }
- style的使用,插入背景图
var style = new Object(); style[mxConstants.STYLE_SHAPE] = mxConstants.SHAPE_IMAGE; style[mxConstants.STYLE_PERIMETER] = mxPerimeter.RectanglePerimeter; style[mxConstants.STYLE_IMAGE] = 'IMGUrl'; graph.getStylesheet().putCellStyle('image4gray', style);
//插入CELL中使用image4gray;即可
cell = graph.insertVertex(parent, null, name, x, y, cellWidth, cellHeight, 'image4gray;rounded=true;strokeColor=none;fillColor=yellow;');
- 获取画布中的所有东西
var mxGraph = this.GetmxGraph();
var parent = mxGraph.getDefaultParent();
var parentChildren = parent.children;
var arrEdge = []; //连接线
var arrVertex = []; //节点
//获取所有信息
for (var i = 0; i < parentChildren.length; i++) {
var child = parentChildren[i];
if (!child.isVisible()) {
continue;
}
//区分连接线、节点
if (child.isEdge()) {
var obj = new Object();
obj.ID = child.id;
obj.SourceID = child.source.id;
obj.TargetID = child.target.id;
arrEdge.push(obj)
} else if (child.isVertex()) {
var obj = new Object();
obj.ID = child.id;
obj.Name = child.value;
obj.LeftTopX = child.geometry.x;
obj.LeftTopY = child.geometry.y;
arrVertex.push(obj);
}
}
上一篇: 入门指南:如何使用Mxgraph.js(第一部分)
下一篇: 深入理解Vue3过渡动画
推荐阅读
-
实战体验:轻松上手mxGraph与drawio的使用教程(第1部分)
-
轻松上手 mxGraph 的部分代码示例
-
玩转mxgraph示例(一):轻松连接节点的anchors功能
-
期末大作业:用HTML5轻松制作个人静态网页的代码示例
-
如何在Python中轻松创建、调用和理解def函数,以及参数传递的实际操作与示例代码
-
使用MATLAB实现的多缝夫琅禾费衍射示例(附带061期Matlab源代码) - 第二部分:源代码解析
-
轻松了解 FSharp.Charting:快速上手 Chart.Line 的用法示例
-
Spark精华代码示例之一:轻松实现宽表与窄表之间的转换
-
35 岁实现财务*,腾讯程序员手握2300万提前退休?-1000万房产、1000万腾讯股票、加上300万的现金,一共2300万的财产。有网友算了一笔账,假设1000万的房产用于自住,剩下1300万资产按照平均税后20-50万不等进行计算,大约花上26-60年左右的时间才能赚到这笔钱。也就是说,普通人可能奋斗一辈子,才能赚到这笔钱。在很多人还在为中年危机而惶惶不可终日的时候,有的人的35岁,就已经安全着陆,试问哪个打工人不羡慕?但问题是有这样财富积累必然有像样的实力做靠山。没有人可以不劳而获。 看到这里,肯定有人说,那么对于普通人来说,卷可能真就成了唯一的出路。但是卷也有轻松的卷,“偷懒”的卷法,对于程序员而言,刨除掉一时无法改掉的开会传统占用的大部分时间,如何把有限的时间和精力放在真正重要的架构设计、需求设计上,而不是重复的造*,编码、改bug、手动测试。因此在科技改变生活的今天,学会使用AI工具成为程序员们的必备技能。 以全栈式全自动的软件开发工具飞算SoFlu软件机器人为例,作为全球首款面向微服务架构设计和最佳实践的软件机器人,SoFlu软件机器人改变了原来手工编码的作业模式,通过可视化拖拽方式以及参数配置就能实现等同于编写复杂代码的业务逻辑,在设计业务逻辑时就完成了微服务应用开发,做到“业务即图,图即代码”,实现“软件开发,十倍提效”。 而作为飞算SoFlu软件机器人的一个重要组成部分,FuncGPT(慧函数)支持所有类型函数创建。通过自然语言描述Java函数需求,实时生成高质量、高可读性的Java函数代码。生成代码可直接复制到IDEA,或一键导入Java全自动开发工具函数库。 FuncGPT(慧函数)具有五大核心能力: ● 自然语言:通过自然语言即可生成函数,降低软件开发门槛。 ● 秒级函数开发:全自动秒级开发函数,秒级完成,效率千倍提升。 ● 一站式函数开发应用:函数生成即可直接应用,效率、安全有保障。 ● 质量可靠:生成的函数代码符合业界规范、具备良好的可读性,符合最优解。 ● 灵活生成:可以根据开发人员的具体需求生成并支持调整和修改。 以“将文件流转换为File对象”这个需求为例,以下是FuncGPT(慧函数)秒级生成的代码: / 类名:FileConverter // 函数名:convertStreamToFile // 函数功能:将文件流转换为File对象 // POM依赖包:无 import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; public class FileConverter { /** * 将文件流转换为File对象 * @param inputStream 文件流 * @param filePath 文件路径 * @param fileName 文件名 * @return 转换后的File对象 * @throws IOException 如果发生I/O异常 */ public static File convertStreamToFile(InputStream inputStream, String filePath, String fileName) throws IOException { File file = new File(filePath + File.separator + fileName); // 创建File对象 try (FileOutputStream outputStream = new FileOutputStream(file)) { // 创建文件输出流 byte buffer = new byte[1024]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { // 从文件流读取数据并写入文件 outputStream.write(buffer, 0, bytesRead); } } return file; // 返回转换后的File对象 } } // 函数示例 // 将文件流转换为File对象示例 // 入参:inputStream,文件流 // 入参:filePath,文件路径 // 入参:fileName,文件名 // 出参:file,转换后的File对象 // 调用示例: // InputStream inputStream = new FileInputStream("example.txt"); // String filePath = "C:\\Users\\User\\Documents"; // String fileName = "example.txt"; // File file = FileConverter.convertStreamToFile(inputStream, filePath, fileName); // System.out.println(file.getAbsolutePath); // 输出结果:例如,将文件流转换为File对象后,文件的绝对路径为:C:\Users\User\Documents\example.txt // 则输出结果为:C:\Users\User\Documents\example.txt 通过分析,不难发现以上代码:
-
如何轻松模仿支付宝的倒计时期间效果及提供相应的JavaScript代码示例