JGraph学习

JGraph开发经验谈 契子  本来一直很少有机会接触swing或AWT的,只是最近公司要做一个工作流定制界面,所以才终于得偿所愿。我知道,如果一切从底层做起的话,恐怕时间、精力都不允许,而现成的一些工作流产品又不能满足公司特定行业工作流的需求,所以只好找一个开源的中间件进行修改了。就这样,慢慢的认识了JGraph……  关于JGraph,open-open上是这样介绍的:JGraph,纯Java开发的图形组件,支持 阅读详情

 

JGraph学习
都说JGraph是mvc的。
 
下面就写一个图形编辑器展开学习。
 
图形编辑器首先要能够画图(包括图形的拖放,属性设置),
其次将图形保存,
然后考虑高级特性:undo/redo,open已存在,缩放,布局,输入输出格式等。
 
第一部分
 
1.      JGraph程序或应用的基本结构
JGraph中用
类JGraph来表示一个图,
类GraphLayoutCache来表示视图(以前叫GraphView),
类GraphModel表示视图对应的模型。
之后,用类Cell在GraphLayoutCache,即视图来具体画图。即Cell是图的基本
单元,JGraph里面图是由Cell组成的。
所以,通常可以这样理解整体结构:
 
//创建模型
GraphModel model = new DefaultGraphModel();
//创建视图
GraphLayoutCache view = new GraphLayoutCache(model,
new DefaultCellViewFactory());
//创建JGraph对象
JGraph graph = new JGraph(model, view);
//下面的代码创建很多Cell,并设置
...
//将所有Cell加入JGraph对象
graph.getGraphLayoutCache().insert(cells);
2.     类Cell
作为JGraph中图的基本组成部分,
Cell分为三类:
Vertex,Edge,Port。
如3中的图,Hello和World是Vertex,它们之间的连接线是Edge,而Edge与Hello的连接处,以及与World的连接处称为Port(图中没有显示的表示)。Port是Edge与Vertex的连接点,每一个连接就一定有一个连接点。
 
当然JGraph提供了很多方法来设置Cell的属性,包括外观。
还可以创建用户自己的外观。
3.      JGraph中视图与模型的关系
上面这个视图有两个Vertex,一个Edge,两个Port。
在模型中这样来表示上图的结构:
这个结构从技术上来说一个森林,树相连接的森林,所以用roots这个词来表示。
在JGraph中将所有的Vertex和Edge作为roots级的,将Port作为其子节点加到相应的节点下。
模型提供一系列处理各节点的操作。
4.      创建更有意义的视图
如果要编写一个流程图,那么像3,就可以处理了。因为每个节点上的文字就可以表达了。
现在要创建一个工作流建模的图形编辑器,那么只有文字是不能完全表达的。比如用一个Vertex来表示一个活动节点,活动除了名字可以用Vertex上的文本来表达外,活动还具有时间,条件,类型等属性。这个时候用一个活动对象来表达需要的所有信息,然后将该对象赋给Vertex,用
javax.swing.tree.DefaultMutableTreeNode.setUserObject(活动对象)。这种使用方法与JTree.setUserObject()的意义是相同的。
 
总结一下,当你要在Vertex上表达的意义只有一个属性的时候,可以直接在Vertex上以文本的方法显示,当你要表达的意义超过一个属性的时候,就需要使用user object,就像JTree一样。
 
第二部分
1.      JGraph
一个不完整的简单描述:
JGraph extends JComponent {
...
    org.jgraph.graph.GraphModel    model;
    org.jgraph.plaf.GraphUI            ui;
    org.jgraph.graph.GraphLayoutCache    cache;
    ...      
}
 
出于分解复杂性的考虑,JGraph2将一些可视化属性从view分解给model。
有一个建议:
    尽量避免使用GraphLayoutCache,GraphModel提供了足够的方法来操作graph。只在GraphModel无法处理时使用GraphLayoutCache。如果对一个不可见的Cell使用GraphLayoutCache处理的话,该Cell就变成可见的了。这时应该使用GraphModel处理。
2.      Cell
创建Cell之后,很重要的工作就是赋予其属性。
一个Cell的属性是一个Map:CellAttributeMap(Attribute/value),如下:
 
 
 
多个Cell的属性,即多个Map进一步又构成一个
AllCellsMap(Cell/CellAttributeMap)。
 
属性的设置通过类GraphConstants来实现,通常形式:
GraphConstants.setXxxx(cell的属性Map,Xxx属性的值)。
 
编辑Cell的属性,像上面设置Cell的属性那样,遵循了
所有Cell的属性AllCellsMap (Cell/CellAttributeMap),
                            CellAttributeMap(Attribute/value)
Map nested = new Hashtable();
Map attributeMap1 = new Hashtable();
GraphConstants.setLineColor(attributeMap1 , Color.orange);
nested.put(cell1, attributeMap1 );
Map attributeMap2 = new Hashtable();
GraphConstants.setLabelAlongEdge(attributeMap2 , true);
nested.put(cell2, attributeMap2 );
graph.getgraphLayoutCache().edit(nested, null, null, null);
 

graph.getGraphLayoutCache().insert(nested, null, null, null);(?)
还有一种改变Cell属性的方法:
给edit()传递一个Cell,以及该Cell新的属性Map,如果旧属性中的属性:
 
例如:
1.      GraphModel
2.      GraphLayoutCache
[1] 在新Map上,根据新Map修改原来的值;
[2] 不在新Map上,继续保持;
[3] 在新Map的REMOVEATTRIBUTES列出的属性中,则删除原属性;
[4] 新Map中出现了原属性中没有的属性,则保持该新属性。
删除Cell属性
Object[] keys = new Object[] { GraphConstants.ICON };
GraphConstants.setRemoveAttributes(map, keys);
 
删除Cell
 
Cell接口
如上是Cell的接口图,
Cell有三类,Edge和Port都有对应的接口。
GraphCell既代表Cell,同时Cell的默认实现被认为就是Vertex,所以GraphCell也就是Vertex的接口。
 
Cell接口中提供setAttriubtes()和getAttributes()
似乎setAttriubtes()要少用或不用,因为下面讲到的GraphModel的insert,edite和remove方法是改变属性的默认方式(GraphLayoutCache也有这三个方法),并且setAttriubtes()的方式似乎不会把改变记录到undo的记录中。
getAttributes()倒是常用。
Edge接口中提供getSource(), getTarget(), setSource() ,setTarget(),
    这几个跟与Edge连接的Port有关。
Port接口提供edges(), addEdge() , removeEdge():与Edge有关,
    getAnchor() and setAnchor():与Vertex有关。
 
Cell实现
如上图:
这里只画了类层次的继承,没有画接口上的继承关系。
除了其他接口外
DefaultGraphCell继承了GraphCell接口,
DefaultEdge继承了GraphCell接口,Edge接口
DefaultPort继承了GraphCell接口,Port接口
 
DefaultCell的实现的几个问题
    构造函数
    clone()
    user object
 
Cell的View
到目前为止,Cell都还只有数据结构,没有视图。每个Cell至少有一个CellView来显示。CellView处理Cell在可视化方面的功能。
CellView需要renderer,editor,handle。
为什么要使用CellView,而不是直接用Cell来处理视图表现,JTree之类是没有JTreeView的,JTree和一个renderor就完成所有事情(JGraph是swing的继承,所以经常比较两者)。
因为:
JGraph中component比swing中复杂,显示任务也就比swing的component重。
GraphModel和GraphLayoutCache已经完整表达了图的概念,对于那些只想做基于图的分析的人来说,这已经足够了。但是对于需要复杂显示的人来说还不够。
有了CellView似乎对同一个Cell采用不同的显示时,更方便实现。
renderer将component的绘制功能分解出来。(flyweigth)
editor用来编辑Cell的内容。
handle在swing中可以理解为用editor编辑,在JGraph中意为对Cell的拖动,大小调整,以及其他对Cell和多个Cell的交互操作。(基于composite模式)
 
下面是View,editor,renderer,handle的关系:
一个问题:
类AbstractCellView中并没有CellHandle的变量。
 
CellView接口:
    getRendererComponent(), getHandle(), getEditor ()
refresh():
    当CellView关联的Cell改变时被调用。
但是refresh()只更新CellView的内在属性,而不会repaint CellView外观。
update()
    refresh()用它同步CellView和Cell的数据。
getParentView(), getChildViews(), removeFromParent() ,isLeaf(),
在Vertex边框上的什么位置做Edge的连接:getPerimeterPoint()
 
创建新的CellView和renderer:
记得使用flyweight模式,为每种类型的CellView保持一个静态的render实例,这样可以减小内存使用。
public class MyView extends AbstractCellView {
protected static MyRenderer renderer = new MyRenderer();
public MyView() {
super();
}
public MyView(Object arg0) {
super(arg0);
}
public CellViewRenderer getRenderer() {
return renderer;
}
public Point2D getPerimeterPoint(EdgeView edge, Point2D source,
Point2D p) {
if (getRenderer() instanceof MyRenderer)
return ((MyRenderer)
getRenderer()).getPerimeterPoint(this,
source, p);
return super.getPerimeterPoint(edge, source, p);
}
public static class MyRenderer extends JLabel implements
CellViewRenderer, Serializable {
public void paint(Graphics g) {
}
public Component getRendererComponent(JGraph graph, CellView
view, boolean sel, boolean focus, boolean preview) {
}
public Point2D getPerimeterPoint(VertexView view, Point2D
source, Point2D p) {
}
}
}
 
利用CellViewFactory来创建新的CellView:
为每个Cell创建一个View,然后将它们关联,是件麻烦的事情,所以使用CellViewFactory来简化这种创建过程。
CellViewFactory利用createView()来创建view。
GraphLayoutCache关联了CellViewFactory,并有setter和getter。
如果创建GraphLayoutCache的时候没有指定CellViewFactory的话,默认使用DefaultCellViewFactory。
下面是一个新的CellViewFactory的片断:
public CellView createView(GraphModel model, Object cell) {
CellView view = null;
if (model.isPort(cell))
view = createPortView(cell);
else if (model.isEdge(cell))
view = createEdgeView(cell);
else
view = createVertexView(cell);
return view;
}
protected VertexView createVertexView(Object cell) {
if (cell instanceof MyVertex) {
return new MyVertexView(cell);
}
return new VertexView(cell);
}
protected EdgeView createEdgeView(Object cell) {
return new EdgeView(cell);
}
protected PortView createPortView(Object cell) {
return new PortView(cell);
}
 
 
CellView的默认实现:
VertexView
PortView
EdgeView
 
Renderer的默认实现:
PortRenderer
VertexRender
EdgeRender
对每类CellView只有一个renderer实例,因此在绘制每个CellView前要根据这个CellView的需要设置renderer的属性。Renderer中保存了Cell的当前状态(selected,preview,focus),因为绘制Cell的时候是需要状态的。
 
 
1.      GraphModel
三个重要方法:
insert()
edit()
remove()
    GraphLayoutCache中有类似的三个方法。
   
 
访问GraphModel的数据:
    在root级访问
    getRootCount(),
getRootAt(),
getIndexOfRoot() ,
contains()
更灵活的访问:
Object getSource(Object edge),//Edge的源Port
Object getTarget(Object edge)//Edge的目标Port
boolean isEdge(Object edge),
boolean isPort(Object port)
根据关系的访问:
Object getParent(Object child)
int getIndexOfChild(Object parent, Object child)
Object getChild(Object parent, int index)
int getChildCount(Object parent)
示意图:
 
根据以上方法得到一些有用的程序片断:
连接到一个Vertex的所有Edge
List listEdges = new ArrayList();
int numChildren = model.getChildCount(cell);
for (int i = 0; i < numChildren; i++) {
Object port = model.getChild(cell, i);
if (model.isPort(port)) {
Iterator iter = model.edges(port);
while (iter.hasNext()) {
listEdges.add(iter.next());
}
}
}
 
获取Edge的源和目标Vertex
Object sourceVertex = model.getParent(model.getSource(edge));
Object targetVertex = model.getParent(model.getTarget(edge));
 
2.      GraphLayoutCache
掌握JGraph:图表库的使用与自定义实例 在现代Web应用程序中,图形用户界面(GUI)已经成为了必不可少的组成部分,尤其是在流程图、网络图、组织架构图等领域。JGraph,一个基于Java的图形库,为开发者提供了创建和操作这些图形的强大工具。JGraph以其灵活性和强大的功能,在图形库领域占据了一席之地。JGraph图形库可以广泛应用于多种场景,比如软件设计、文档建模、网络拓扑、项目管理等领域。由于其Java语言的平台独立性,JGraph能够帮助开发者轻松地在不同操作系统和浏览器上实现复杂图形的展示和交互。 阅读详情

相关推荐

JGraph文档和demo

介绍JGraph框架,还有一些demo和一些架包!

推荐:Jgraph - 灵活可定制的数据可视化库

推荐:Jgraph - 灵活可定制的数据可视化库 项目介绍 Jgraph是一个强大且易于使用的Android图形库,旨在帮助开发者轻松创建动态和交互式的柱状图以及折线图。这个开源项目由mychoices开发并维护,提供了多种图表样式、动画效果和自定义选项,为你的应用添加专业级别的数据可视化功能。 项目技术分析 Jgraph的核心在于它的灵活性和可扩展性。它支持通过XML属性进行高度定制,包括图表类...

gitblog_00070的博客 531

jgraphx 包 API文档

jgraphx包,jgraph的升级版本

(转)图论的最佳实践- JGraph

看了JGraph的设计文档 --《Design and Implementation of the JGraph Swing Component》,第一次感觉到图论-这一离散数学理论在实际项目中的作用。经典的图论研究图与点和边的关系JGraph扩展了经典图论,将图形应用系统中的图形分解成: Vertex (顶点)、Edge(边)、Port(连接点)三个基本元素。同时JGraph使用两个

桔子的专栏 2228

图形化开源软件jgraph

图形化开源软件 jgraph的工程,用于后台或JApplet开发

IKM 测试题 - Java SE 8 评估测试题目

IKM 测试题 - Java SE 8 评估测试题目

licheng11y的博客 1315

jGraph简介

Jgraph http://www.jgraph.com/ 是一个开源的,兼容Swing的基于MVC体系结构图形组件,具有以下特点: 1) 完全Swing兼容; 2) 简单、高效的设计; 3) 时间效率高; 4) 100 %纯Java; jGraph简介 jGraph具有相当高的交互性和自动化,是一套为图定做的组件。其主要用途是在一些需要表示图结构的应用中,比如...

guoguo1982_2001的专栏 839

深信服aCloud虚拟存储VS3.0实战:从数据分片到仲裁机制的全流程解析

本文深度解析了深信服aCloud虚拟存储VS3.0的核心架构与生产级实践。从数据分片、条带化写入、多副本机制到智能缓存分层,详细阐述了其如何实现高性能与高可靠性的平衡。同时,深入剖析了动态均衡、平滑扩容以及故障恢复与仲裁机制,为运维人员和技术决策者提供了在超融合基础架构(HCI)中部署和管理虚拟存储的实战指南。

net55的博客 588

JGraph学习笔记(一)

      总算空下来了,开始正式学习JAVA图形编程, 先熟悉下SWING,JGRAGH. [转]在Java中使用JGraph实现图形绘制 http://soft.yesky.com/132/2209132.shtml本来一直很少有机会接触swing或AWT的,只是最近公司要做一个工作流定制界面,所以才终于得偿所愿。我知道,如果一切从底层做起的话,恐怕时间、精力都不允许,而现成的一些

elaine‘s workshop 2326

用易经智慧看懂人工智能:64卦中的科技密码--当古老智慧遇见未来科技

在人工智能狂飙突进的今天,我们总在追问:这些代码构建的智能究竟会带人类走向何方?或许答案早已藏在《周易》的六十四卦中——这本中华文明的“源代码”,正用一种跨越时空的语言,悄悄解释着最前沿的科技秘密。

weixin_38410320的博客 2084

手把手教你用Arduino IDE玩转ESP32-S3-wroom(附串口调试技巧)

本文详细介绍了如何在Arduino IDE环境下配置和使用ESP32-S3-WROOM模块,包括开发环境搭建、硬件连接、程序烧录及高级调试技巧。通过实战步骤和常见问题解决方案,帮助开发者快速上手这一高性能Wi-Fi/蓝牙双模模组,提升物联网开发效率。

weixin_30487201的博客 293

JGraph的学习介绍(初稿)

 1.2   编辑操作的组织 对象类程序分析  通过下面的Map结构,可以有效的组织你的编辑操作,并且放在一个undo事件中Map nested = new Hashtable();Map attributeMap1 = new Hashtable();GraphConstants.setLineCol

zhfzhf的专栏 2908

STM32 FATFS文件系统按行读取SD卡数据

STM32 SD数据实现按行读取

qq_32216815的博客 7828

JWFD v0.96 版本的发布说明

事实上,JWFD从一开始就是一个相对完整的流程系统,不仅仅是一个包括JGRAPH组件的设计器,更包括流程数据结构和流程引擎等模块,JWFD的定位 是一个供业内朋友学习和借鉴工作流技术和设计思想的的学习型软件包,对任何商业集成都持开放和合作的态度。。。。。 因为在我看来,工作流技术...

chenglan8953的博客 148

端侧部署与优化:让 AI 真正走进现实生活的关键技术

AI 的开发流程分为 “训练” 与 “推理” 两大阶段。在训练阶段,科研人员依托云端海量数据和高性能 GPU 算力,构建出精度优异的 AI 模型 —— 比如能识别 1000 种物体的图像分类模型、能理解人类语言的自然语言处理模型。但这些在云端 “战绩斐然” 的模型,若直接应用到现实场景中,却会面临三大 “落地困境”。从云端到端侧,从模型压缩到硬件适配,端侧部署与优化技术解决了 AI 落地的核心难题,让 AI 不再是实验室里的 “高精尖技术”,而是融入日常生活的 “实用工具”。

m0_63477749的博客 1053

Agisoft Metashape相机标定笔记

使用Metashape进行自动相机标定是可能的。(可选:使用打印的棋盘格图案,但需保证它是平坦的且单元格是正方形)。相机标定步骤支持全相机标定矩阵的估计,包含非线性的畸变参数。相机模型的细节请参照附录D——相机模型板块。:在通用的工作流程中,相机标定步骤可以跳过。因为Metashape会在图像定向过程中进行相机自标定。但是,如果定向结果不稳定,例如,由于影像之间缺乏连接点,额外进行单独的相机标定步骤也许是有用的。

天桥飞熊的博客 3976

一个 jgraph的例子

 Jgraph http://www.jgraph.com/ 是一个开源的,兼容Swing的基于MVC体系结构图形组件,具有以下特点: 1) 完全Swing兼容; 2) 简单、高效的设计; 3) 时间效率高; 4) 100 %纯Java; jGraph简介         jGraph具有相当高的交互性和自动化,是一套为图定做的组件。其主要用途是在一些需要表示图结构的应用中,比如流程图、UML、交

Michael的专栏 3445

YOLO26 正式发布源代码!极致速度优化方案, 面向工业级落地的目标检测模型!

YOLO26 作为 Ultralytics 公司于 2025 年 9 月发布的最新一代目标检测模型,在架构设计和技术实现上展现了显著的创新。本文深入分析了 YOLO26 的核心架构改进和技术原理,重点探讨了其在边界框回归、推理流程、损失函数设计和优化算法方面的突破性进展。

魔改工程师的博客 1244

初识jGraph

初识jGraph序        在为老师写项目的时候我急需一个基于java的图形组件,第一次搜索就搜索到了jGraph。总体感觉还是挺容易上手的,是一套能够应对多种图形用途的工具。虽然我对其中一些编程的风格有些不是很满意。不过能做出来就是好的!而且效果十分出色,感谢jGraph社团带给我们的强大工具。        最令我欣赏的是,jGraph在对需要使用jGraph Layout Pro的

4984

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Jgraph的使用

轨道 package APIs; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.Point2D; import org.jgraph.graph.CellViewRenderer; import org.jgraph.graph....

qq_42725437的博客 2362

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

JGraph分析

JGraph分析                                                                        Johnny.DengJGraph是一个开源的,兼容Swing的基于MVC体系结构图形组件,具有以下特点:1)   完全Swing兼容;2)   简单、高效的设计;3)   时间效率高;4)   100 %纯Java;

John.Deng的专栏 2514

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

[转]初识jGraph

序        在为老师写项目的时候我急需一个基于java的图形组件,第一次搜索就搜索到了jGraph。总体感觉还是挺容易上手的,是一套能够应对多种图形用途的工具。虽然我对其中一些编程的风格有些不是很满意。不过能做出来就是好的!而且效果十分出色,感谢jGraph社团带给我们的强大工具。        最令我欣赏的是,jGraph在对需要使用jGraph Layout Pro的学术应用只收半价,这

elaine‘s workshop 1980

图形化组件JGraph

JGraph分析                                                                        Johnny.DengJGraph是一个开源的,兼容Swing的基于MVC体系结构图形组件,具有以下特点:1)   完全Swing兼容;2)   简单、高效的设计;3)   时间效率高;4)   100 %纯Java;生成的图例 二、JGr

jihanzhong的专栏 1657

JGraph

Design and Implementation of the JGraph Swing Componenthttp://jgraph.sourceforge.net/doc/paper/index.html  JGrah Manual: 关于hander:就是选中组件后出现在四周的那几个小点。关于Vertice,Edge:We can create new simple

yethyeth的专栏 4294

JGraph 画出你想要的图形

  最近在学着使用开源的JGraph,为了能添加一个自己的cell,看了一堆帖子。这些帖子有一个特点,千篇一律,你转我的,我转你的,感觉太没意思了吧,始终只能画出锥形。后来还是直接搜索英文的了,搜到了The JGraph Tutorial。其中给了一个很好的例子,我略作了一些修改,功能是添加了一个自己的EllipseCell,画出了椭圆或者圆,这个取决于代码中的GraphConstants.set...

GJ微风 487
上一篇: jdom入门(基本的操作都可以)
下一篇: 关于java反射
yethyeth
博客等级 码龄21年 140粉丝 265原创
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值