JGraph分析

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

JGraph分析
                                                                        Johnny.Deng

JGraph是一个开源的,兼容Swing的基于MVC体系结构图形组件,具有以下特点:

1)   完全Swing兼容;

2)   简单、高效的设计;

3)   时间效率高;

4)   100 %纯Java;

生成的图例
生成的图例

 

二、JGraph设计

1)  MVC

Swing是Java(Sun)提供的UI标准实现之一,Swing基于AWT(Abstract Windowing Toolkit)。JGraph完全兼容Swing,它的实现仍然基于MVC体系结构。

 

 

JGraph MVCJGraph MVC

 

View:

JGraph不包含实际的数据,它提供了数据的视;JGraph对象画图的机制是:

将图元定义为一个一个的cell,每个cell可以是一个顶点(vertex)、边(edge)或者节点(port)中的一种。顶点可以有邻接的顶点,他们通过边相联系,边联接的两个端点称为目标和源,每个目标或者源是一个节点。节点是顶点的孩子。每个cell都可以有自己的孩子。

每个cell的外观由相应的属性定义,属性序列是指一系列的键-值对,他们以Map形式组织,例如:

Map cellAttrib = new Hashtable();

// Set bounds

Rectangle2D helloBounds = new Rectangle2D.Double(20, 20, 40, 20);

GraphConstants.setBounds(cellAttrib, helloBounds);

// Set black border

GraphConstants.setBorderColor(cellAttrib, Color.black);

 

一个cell有类似这样一个cellAttrib的Map,来定义其外观。

外观可以指定诸如一条边的箭头样式等属性。

 

Model:

数据对象可以看成是JGraph中两个独立结构的链接点:grahp结构和group结构。Graph结构基于图论中的顶点、边定义。Group结构是cell的composition结构。Graph结构中getSource()和getTarget()方法,获得源和目标节点。而在group中通过getChild(),getParent()来获得cell的组成结构。

 

2)  低层基于图论逻辑

即:一个图G包含一个非空的元素集V(G)和一个E(G),其中,E(G)是V(G)中两个无序元素组成的二元组。V(G)称为图G顶点的集合,如果任意集合V(G)中的顶点x/y,(x,y)在E(G)中,边(x,y)可能以连接顶点x和y的边(弧)所代表,X与y就被称为邻接的,否则x与y不邻接。

 

三、JGraph的应用

以下是一个基于JGraph的Helloworld的分析:

import省略

public class HelloWorld {

 

  public static void main(String[] args) {

 

    // Construct Model and Graph

    //

    GraphModel model = new DefaultGraphModel();

    JGraph graph = new JGraph(model);

    graph.setSelectNewCells(true);

 

    // Create Nested Map (from Cells to Attributes)

// 此Map中记录所有属性,其中的键-值对是cell-cellAttribute

// 每个cellAttribute又是一个Map,其键-值对是具体一个cell的属性-值

    Map attributes = new Hashtable();

 

//  以下建立两个顶点(cell)Hello和World,并分别设置他们的属性Map

// Create Hello Vertex

    //

    DefaultGraphCell hello = new DefaultGraphCell("Hello");

   

    // Create Hello Vertex Attributes

    //

    Map helloAttrib = new Hashtable();

    attributes.put(hello, helloAttrib);

    // Set bounds

    Rectangle2D helloBounds = new Rectangle2D.Double(20, 20, 40, 20);

    GraphConstants.setBounds(helloAttrib, helloBounds);

    // Set black border

    GraphConstants.setBorderColor(helloAttrib, Color.black);

 

    // Add a Port

    //  每个顶点为了与其他顶点相邻接,必须添加节点(cell)

    DefaultPort hp = new DefaultPort();

    hello.add(hp);

 

    // Create World Vertex

    //

    DefaultGraphCell world = new DefaultGraphCell("World");

 

    // Create World Vertex Attributes

    //

    Map worldAttrib = new Hashtable();

    attributes.put(world, worldAttrib);

    // Set bounds

    Rectangle2D worldBounds = new Rectangle2D.Double(140, 140, 40, 20);

    GraphConstants.setBounds(worldAttrib , worldBounds);

    // Set fill color

    GraphConstants.setBackground(worldAttrib, Color.orange);

    GraphConstants.setOpaque(worldAttrib, true);

    // Set raised border

    GraphConstants.setBorder(worldAttrib,

           BorderFactory.createRaisedBevelBorder());

 

    // Add a Port

    //

    DefaultPort wp = new DefaultPort();

    world.add(wp);

 

// 建立联接两个顶点的边

// Create Edge

    //

    DefaultEdge edge = new DefaultEdge();

   

    // Create Edge Attributes

    //

    Map edgeAttrib = new Hashtable();

    attributes.put(edge, edgeAttrib);

    // Set Arrow

    int arrow = GraphConstants.ARROW_CLASSIC;

    GraphConstants.setLineEnd(edgeAttrib , arrow);

    GraphConstants.setEndFill(edgeAttrib, true);

 

    // Connect Edge

    // 边的两个端点就是两个顶点的child节点(port)

    ConnectionSet cs = new ConnectionSet(edge, hp, wp);

    Object[] cells = new Object[]{edge, hello, world};

 

    // Insert into Model

    // model构件完成

    model.insert(cells, attributes, cs, null, null);

 

    // Show in Frame

    //

    JFrame frame = new JFrame();

    frame.getContentPane().add(new JScrollPane(graph));

    //frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    frame.pack();

    frame.setVisible(true);

  }

 

}

16、模型转换:从Petri网到jGraph及API映射的深度解析 本文深入解析了从Petri网到jGraph的模型转换过程,并探讨了元模型与Java对象模型之间的映射机制。通过Eclectic映射语言和领域特定语言(DSL)实现转换规则,结合构造函数映射、用户自定义映射以及设计模式的应用,提升模型转换的灵活性与扩展性。文章还总结了关键操作步骤和技术要点,并通过案例展示了其在实际场景中的应用价值。 阅读详情

相关推荐

掌握JGraph:图表库的使用与自定义实例

在现代Web应用程序中,图形用户界面(GUI)已经成为了必不可少的组成部分,尤其是在流程图、网络图、组织架构图等领域。JGraph,一个基于Java的图形库,为开发者提供了创建和操作这些图形的强大工具。JGraph以其灵活性和强大的功能,在图形库领域占据了一席之地。JGraph图形库可以广泛应用于多种场景,比如软件设计、文档建模、网络拓扑、项目管理等领域。由于其Java语言的平台独立性,JGraph能够帮助开发者轻松地在不同操作系统和浏览器上实现复杂图形的展示和交互。

weixin_32869687的博客 1205

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

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

gitblog_00070的博客 531

JGraph文档和demo

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

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

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

桔子的专栏 2228

jgraphx 包 API文档

jgraphx包,jgraph的升级版本

JGraph的开始

JGraph的英文教程 博文链接:https://longyi-java.iteye.com/blog/208906

jGraph简介

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

guoguo1982_2001的专栏 839

jgraph官方示例与帮助文档

全面的jgraph使用示例,包括十多个例子,与详细的说明及源代码

探索jgraph:嵌入式WebGL图可视化库

探索jgraph:嵌入式WebGL图可视化库 项目介绍 jgraph 是一个嵌入式的WebGL图可视化库,旨在为开发者提供一个高效、灵活的工具,用于在网页中展示复杂的图形结构。无论是学术研究、数据分析还是教育演示,jgraph 都能帮助你轻松地将图形数据可视化。 项目技术分析 jgraph 的核心技术基于WebGL,这是一种用于在网页上渲染3D图形的JavaScript API。通过WebGL,j...

gitblog_00800的博客 815

jgraph官方文档

最新jgraph官方文档,非常好的学习jgraph资料,全面讲解了jgraph的使用与设计模试

【ue4】【新手入门】|静态网格模型碰撞设置和合并Actor(合并静态网格体)

上一期学到把构建好的房子模型变成一个静态网格体(也是一个模型)但是静态网格体是没有碰撞的 所以要给这个模型设置碰撞。

m0_63501513的博客 4420

【亲测免费】 JGraph 项目教程

JGraph 项目教程 1. 项目介绍 JGraph 是一个开源的 Java 图形库,用于创建和操作图形数据结构。它提供了丰富的图形算法和数据结构,适用于各种图形处理任务。JGraph 最初由 Gaudenz Alder 和 David Benson 在 2000 年创建,是一个纯 Java 语言的项目,旨在扩展 Swing 工具包的功能。 JGraph 的主要特点包括: 支持多种图形类型,如简...

gitblog_00654的博客 1305

一篇关于轴承故障诊断的综述

在设备的故障检测中,有约30%-40%的设备故障是由轴承故障引起的,因此本文将列举有关检测轴承故障使用到的相关数据集,模型和算法。 数据集 现有的数据集,普遍由固定在电机马达上的两个震动检测器获得,并根据需要,分离震动数据在时域和频域上的特征以供网络模型学习。 不同的数据集,区别在于,检测的马达转速不同,环境不同,取样频率不同,一段样本的时长不同等等 (1)Case Western Reserve University (CWRU) Dataset 该数据集拥有多种数据,测量的时候,通过改变轴承.

weixin_42036144的博客 2万+

JWFD正式支持WINDOWS7以上操作系统

在WINDOWS7平台下,JDK1.8版本中,6GB内存,4核心CPU JWFD的随机函数分析器通过了长达187分钟的高强度计算测试。JWFD开发者COMSCI通过升级绘图模块JGRAPH5.12类库,实现支持WINDOWS7或以上操作系统的能力。

comsci的专栏 134

Ubuntu 20.04下Cube-Studio云原生平台单机部署全攻略(附避坑指南)

本文详细介绍了在Ubuntu 20.04系统上单机部署Cube-Studio云原生平台的完整流程,包括环境准备、Docker配置、Rancher与Kubernetes集群部署以及Cube-Studio核心组件安装。特别提供了官方文档未涵盖的实战技巧和常见问题解决方案,帮助开发者高效完成部署并避免常见陷阱。

weixin_29313423的博客 465

YOLOv11旋转目标检测详解:从原理到实战的全面指南

本文介绍了YOLOv11旋转目标检测技术的核心概念、架构设计与应用场景。传统目标检测使用水平边界框(AABB)存在背景噪声大、定位精度低等问题,而旋转边界框(OBB)通过引入角度参数显著提升了检测精度,在遥感、OCR、工业质检等领域具有独特优势。YOLOv11-OBB采用改进的多尺度检测层、CSPDarknet53骨干网络和双通道角度输出机制,在保持实时性的同时实现精确的旋转目标检测。实验表明,该方法在DOTA数据集上达到81.3%的mAP,相比传统方法提升显著,特别适合处理具有旋转特性或高宽比悬殊的目标。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 302

一个mvc结构的例子java_一个 jgraph的例子 | 学步园

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

weixin_40006779的博客 224

使用MATLAB和Simulink来设计并仿真一个智能家居多传感器数据融合系统

智能家居多传感器数据融合系统旨在通过集成来自多种不同类型的传感器的数据,以提供更精确和可靠的环境信息或用户状态监测。例如,将温度、湿度、光照强度、运动检测等多种传感器的数据结合起来,可以更好地了解家庭内部的状态,并做出相应的调整或响应。在这个教程中,我们将使用MATLAB和Simulink来设计并仿真一个智能家居多传感器数据融合系统。

amy_mhd的博客 189

几个可以画网络拓扑图的开源库

之前做个监控系统,需要在GUI客户端有个网络拓扑结构图,实时显示被监控节点的连接情况, 支持动态增减监控节点,能够在拓扑图上自动布局。找到了三个比较合适的库:   SWT的ZEST : 基于draw2D库封装的,增加了一些事件处理,动画效果和几个常见布局; 是个比较粗糙的类库,图节点都被一个矩形框包围,就算是自己定义了透明背景的icon,周围也必须 被一个方框包围,要命的是如果你的图节...

iteye_773的博客 5033

【TCN回归预测】TCN时间卷积神经网络数据回归预测(多输入单输出)【含Matlab源码 2317期】

TCN时间卷积神经网络数据回归预测 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版)或下载付费资源,可赠送奶茶价版付费专栏指定代码1份; 823

boost::circular_buffer缓行缓冲区

1、circular_buffer实现了一个环形缓冲区,空间大小是固定的,当到达容器末尾时,将自动利用容器另一端的位置空间。 2、当程序需要容纳大量的元素,但多数情况下仅保存较少数量元素时可以使用circular_buffer_space_optimized,他可以有效的减少内存的占用,提高程序的运行效率。 3、主要接口: 4、实现一个生产者---消费者模式示例: #inc...

小米的修行之路 792

一个 jgraph的例子

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

Michael的专栏 3445

python实现带符号的二进制数转换十进制数 (附完整源码)

python实现带符号的二进制数转换十进制数 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 556

伟大的MVC模式

前言 省略. 伟大的MVC模式 MVC模式之所以伟大,是因为它符合大脑的工作原理。   大脑在某个时间点关注的内容是唯一的,而MVC恰好把那些杂糅在一起的东西分成外观和内容; 这样人们就能在想关注外功的时候就看V,想关注内容的时候就看M。   MVC是一种架构,在JGraph中可以看到更细小的结构:   mxPoint(位置) mxRectangle(大小) mxCellState(外观) mxC...

isuifeng的专栏 137

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

初识jGraph

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

4984

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

上一篇: OOP编程原则与设计模式(1)
下一篇: U2TP分析
dbigbear
博客等级 码龄24年 54粉丝 149原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值