当前位置:首页 >> 能源/化工 >>

Jgraph中文


JGraph 的用户手册 目录 1 1.1 JGraph 的做什么? 1.2 什么是 1.2.1 图形可视化 1.2.2 图表互动 1.2.3 图表布局 1.2.4 图形分析 1.3 关于本 1.3.1 本手册的先决条件......................................... .......................................

.......... 12 1.3.2 获得更多 1.4 关于 1.4.1 JGraph 的秋千 1.4.2 把 JGraph 1.4.2.1 1.4.3 1.4.4 JGraph 的 1.5 获取 1.5.1 JGraph 网站 1.5.2 下装 1.5.3 安装 1.5.4 项目结构和构建选项.......................................... ......................................... 17 1.6 的设计 2 JGraph 的图形 2.1 重要应用。 2.2 了解 HelloWorld 应用程序............................................. ................................ 19 2.2.1 创建 2.2.2 插入 2.2.2.1 配置单元的属性,然后插入......................................... ................ 24 2.2.3 编辑图表 2.2.3.1 删除单元格 2.2.4 删除 2.2.5 属性 2.2.5.1 属性地图编辑后呼叫......................................... ............................. 29 2.2.6 复杂 2.2.7 2.3 创建和配置 JGraph 类........................................... .................................. 32 2.3.1 配置 2.4 走势图 2.4.1.1 2.4.1.2 3 编辑 2.4.1.3 访问图形模型数据.......................................... ................................... 36 2.4.1.4 克隆的图模型........................................... .............................................. 38

2.4.1.5 导航连接使用而 GraphModel 接口....................................... 38 2.4.1.5.1 获取连接到一个顶点的边的集合.................................... 0.40 第3页 JGraph 的用户手册 2.4.1.5.2 获取源和目标顶点的边缘.................................... 40 2.5 设计合同 3 3.1 类型 3.2 细胞的接口和默认的实现............................................ ............................... 42 3.2.1 GraphCell 3.2.2 边缘和端口 3.2.3 3.2.3.1 默认图表细胞构造函数和方法........................................ ....... 45 3.2.4 克隆 3.3 用户 3.3.1 获取和更改用户对象......................................... ............................... 47 3.4 细胞 3.4.1 细胞 3.4.2 手机浏览 3.4.2.1 3.4.2.2 3.4.2.2.1 如何创建自己的单元查看和渲染.................................... ...... 51 3.4.3 创建细胞意见和关联与细胞....................................... ............. 52 3.4.4 默认的单元格视图和渲染的实现......................................... .................... 54 3.4.4.1 的细胞 3.4.4.2 的细胞 3.4.4.2.1 3.4.4.2.2 3.4.4.2.3 3.5 使用 3.5.1 使用 3.5.1.1 3.5.1.2 顶点界的约束............................................ ........................................ 58 3.5.1.3 调整和 3.5.1.4 3.5.1.5 标签 3.5.1.6 3.5.1.7 3.5.1.8 3.5.2 使用 3.5.2.1 3.5.2.2 控制点和路由........................................... ........................................... 62 3.5.2.3 定位边缘 3.5.2.4 边缘

3.5.2.5 边缘端 3.5.2.6 连接 3.5.3 两个顶点和边的属性......................................... ................................... 69 3.5.3.1 基本的编辑功能的约束........................................... ........................... 69 3.5.3.2 3.5.3.3 3.5.4 使用 3.5.4.1 港 第4页 JGraph 的用户手册 3.6 4 高级 4.1 4.1.1 图形模型表示的分组.......................................... ............................. 76 4.1.2 4.1.3 集团 4.1.4 移进/出 4.1.5 移除子 4.2 4.3 4.3.1 本地查看 4.3.2 4.3.2.1 配置能见度编辑操作后,.......................................... ............. 82 4.3.3 本地查看 4.3.4 展开和折叠组........................................... ........................................ 84 4.3.5 其他 GraphLayoutCache 选 项............................................ ........................................ 85 4.4 高级型 4.4.1 型号 4.4.2 4.4.2.1 4.4.2.1.1 撤消支持继电器......................................... ................................................. 87 4.4.2.1.2 4.5 拖动和 4.6 4.7 5 5.1 走势变化的事件和监听............................................ ............................................ 92 5.2 GraphUI 和处理鼠标输入........................................... ....................................... 93 5.2.1 鼠标 5.2.2 5.2.3 5.2.4 6 个 I / O 和 JGraph 的

6.1 XML 6.2 图片 6.3 SVG 6.4 导出一个无头的环境中............................................ ....................................... 100 6.5 工作没有 Swing 组件............................................ .................................... 101 在 6.6 JGraph 的 6.7 7 7.1 简介 7.2 安装和编译 7.2.1 7.2.2 7.2.2.1 项目结构和构建选项.......................................... ............................... 104 7.3 JGraph 的布局设计........................................... .............................................. 107 7.3.1 JGraph 的布局 Pro 的是什 么?............................................. ......................................... 107 第5页 JGraph 的用户手册 7.4 运行 7.4.1 编写你自己的 7.4.2 边缘控制 7.4.3 7.5 使用 7.5.1 树 7.5.1.1 树 7.5.1.1.1 7.5.1.1.2 7.5.1.1.3 levelDistance 和 nodeDistance .......................................... ........................... 115 7.5.1.1.4 7.5.1.1.5 positionMultipleTrees treeDistance .......................................... ............... 118 7.5.1.2 紧凑树 7.5.1.3 径向树 7.5.2 有机 7.5.2.1 春 7.5.2.2 快速有机 7.5.2.3 倒自筹备地图........................................... ..................................... 123 7.5.2.4 有机 7.5.2.4.1 isOptimizeNodeDistribution 和 nodeDistributionCostFactor ...................... 125 7.5.2.4.2 isOptimizeEdgeLength edgeLengthCostFactor ....................................... 126 7.5.2.4.3 isOptimizeEdgeCrossing 和 edgeCrossingCostFactor ................................. 127 7.5.2.4.4 isOptimizeEdgeDistance,edgeDistanceCostFactor,isFineTuning

[7.5.2.4.5 isOptimizeBorderLine,borderLineCostFactor 和 averageNodeArea ........... 131 的 7.5.2.4.6 minMoveRadius,initialMoveRadius radiusScaleFactor ......................... 133 7.5.2.4.7 7.5.2.4.8 unchangedEnergyRoundTermination ............................................ ................. 134 7.5.2.4.9 7.5.2.5 分层 7.5.2.5.1 7.5.2.5.2 内节点间的距离和等级的单元格间距“..................................... ..... 136 7.5.2.5.3 7.5.3 边缘 7.5.3.1 正交边缘路由............................................ ........................................... 138 7.5.4 简单 7.5.4.1 圈 7.6 使用示例源代码............................................ ............................................... 140 7.6.1 进度 附录 A 第6页 JGraph 的用户手册

1 引言 JGraph 的是一个成熟的,功能丰富的开源图形可视化库用 Java 编写的。 JGraph 的写入,在视觉上和在它的设计是一个全摆幅兼容组件 架构。 JGraph 的,可以运行在任何支持 Java 1.4 或更高版本的系统。 1.1 JGraph 的做什么? JGraph 的客户端或服务器端提供了一系列的图形绘制功能 应用程序。 JGraph 的有一个简单,但功能强大的 API,使您能够可视化,交互 自动排版和图表进行分析。下面的部分定义这些 在更详细的条款。 图形可视化库的应用实例包括流程图, 工作流和 BPM 的可视化流程图,交通,水流量,数据库和 WWW 可视化,网络和电信显示器,绘图应用,地理信息系统,UML 图,电子电路,VLSI,CAD,金融和社会网络,数据挖掘, 生化,生态循环,实体和因果关系和组织 图表。 JGraph 的,通过它的编程 API,提供了配置的图形或 显示网络和装置相关联的上下文或与这些显示的元数据 元素。

1.2 什么是走势图? JGraph 的可视化是基于网络的数学理论,图论。如果 你正在寻找的 Java 条形图,饼形图,甘特图,看看在 JFreeChart 的 项目代替。 一个图的顶点,也称为节点,边缘(由连接线 节点之间的)。究竟如何会出现一个图形视觉上没有被定义在图论中。 术语细胞将在整个本说明书中使用的曲线图来描述一个元件,无论是 边或顶点。 第7页 JGraph 的用户手册

在图论中有额外的定义提供了有用的背景时, 处理图形,它们被列在附录 A 中,如果您感兴趣的。 1.2.1 图形可视化 第8页 JGraph 的用户手册 可视化的过程中,创建一个有用的图形可视化表示。 “ 范围的可视化功能是 JGraphs 的主要力量之一。 JGraph 的广泛支持 的功能,使细胞的显示范围只限于的技能 开发人员。顶点可能是形状,图像和其他 Swing 组件(包括其他 JGraphs),动画,几乎所有的图形操作可以在 Swing 中。 1.2.2 GRAPH 相互作用 互动的方式在应用程序中使用 JGraph 的可以改变的图模型 通过应用程序的 GUI。 JGraph 的支持拖动和克隆细胞,重新调整和改造, 连接和断开,拖动和下降,从外部来源,编辑 细胞中的标签-place 和更多。 JGraph 的主要好处之一是怎样的灵活性 交互可以被编程。

即时预览图形缩放拖动 1.2.3 GRAPH 布局 走势细胞可以在一个简单的应用程序的任何地方,包括顶部的一个 另一个。某些应用程序需要出示自己的信息在一般下令, 具体的有序结构。这可能涉及到确保细胞不重叠,留在 至少一个一定的距离彼此,或该细胞出现在特定的位置相对于 其他细胞中,通常它们被连接到由边缘的细胞。本次活动,称为布局 应用中,可以使用在一个数量的方法来协助用户设置他们的图。对于不可编辑 图形,布局的应用程序的过程中,施加到细胞中的布局算法。 交互性的图形,这些可以被编辑,排版应用程序可能只涉及 允许用户更改某些细胞在特定的位置,重新申请的布局 在每次更改后的图形,或申请时的布局编辑的算法是完整的。

图 5:JGraph 的布局 Pro 中使用的分层布局的工作流程布局 第9页 JGraph 的用户手册 JGraph 的布局 Pro 是支持的布局包内的 JGraph 的套件,专为 速度,API 稳定,功能的灵活性和一致性。布局 Pro 支持范围

树力和层次化的布局,将最适合的布局需要。提供与 完整的源代码,JGraph 的布局 Pro 为你提供优质的布局,在巨大的价值。 本用户手册介绍了如何使用布局功能,请参阅后面的章节 详细信息。 1.2.4 图形分析 第 10 页

图 6:最短路径分析 JGraph 的用户手册 图的分析涉及的应用程序的算法,确定某些细节 有关图形的结构,例如,确定所有的路由或之间的最短路径 两个单元格。还有更复杂的图形分析算法,这些经常被应用于 域特定的任务。如集群,分解和优化技术往往 在某些领域的科学和有针对性的,目前尚未实施的 核心 JGraph 的包。然而,一些通用的性能优化分析 把 JGraph 布局 Pro 包中可以找到算法。 第 11 页 JGraph 的用户手册 1.3 关于本手册 1.3.1 本手册的先决条件 为了充分受益于本手册,你将需要有一个合理的认识 Java 和 Swing 的至少一个高层次的概述。各方面都不是必需的,但 Swing 的

Swing 的 MVC 模式的知识是很重要的,特别是如何渲染器 组件使用。这也将是研究的主要 Swing 组件中的一个 更详细地,特别是 JTree 的类,因为 JGraph 的是类似的 JTree 的在若干 在设计水平的方法。 如果你没有经验的 Java 语言进行编程,有很多好书 可用的主题。一个有用的免费介绍的是 Sun 的 Java 教程。 JGraph 的用户手册 1.4 关于 JGraph 的 1.4.1 jgraph 的 SWING 兼容性 JGraph 的遵循所有的秋千标准,如可插入的外观和感觉,数据传送, 可访问性,国际化,系列化。对于更高级的功能 如撤销/重做,打印和 XML 支持,标准 Swing 的设计也使用。 JGraph 的设计有许多共同的 JTree 的视图概念来 从秋千文本组件。 JGraph 的本身是一个扩展 JComponent 的,这是 秋千基类的所有组件。 JGraph 的,也符合 Java 规范 方法和变量的命名,源代码的布局和 Javadoc 注释。 1.4.2 把 JGraph 包 有三个独立的包可以从 JGraph.com。 主要包 JGraph 的本身,包括基本的 JGraph 的 Swing 组件:

表 1:JGraph 的套件 JGraph 的布局 Pro 是一套功能 JGraph 的基础之上,提供 公用事业,布局和各种图形分析功能。它配备了它自己的 应用笔记和支持,把 JGraph 论坛。

表 2:JGraph 的布局 Pro 软件包 第 13 页 JGraph 的用户手册

也从 JGraph 的 JGraphpad。 1.4.2.1 JGraphpad JGraphpad JGraph 的一个完整的应用程序框架,是一个专业的实施。 JGraphpad 有一个基于 XML 的配置,可编程的用户界面工厂, 定义你想要的应用程序出现在配置文件中。另外还采用了 插件架构,使您的应用程序特定的功能,可以作为一个单一的开发 模块,只需投进 JGraphpad,你有一个现成的图形应用。 JGraphpad 已经集成了所有的额外功能 JGraph 的,以及 JGraph 的布局临选项将布局。 JGraphpad 包括它自己完整的用户手册和一系列的附加功能 发现在免费 JGraph 的版本。这些措施包括 I / O 标准的 XML 支持,丰富的文本编辑器 为顶点的标签,概述面板(鸟瞰),库面板(资源库或调色板), SVG 出口等等。 第 14 页 JGraph 的用户手册 1.4.3 MXGRAPH mxGraph 为所有主要平台是一个基于浏览器的图形库。 mxGraph 使用 本地矢量图形的绘画语言可提供丰富的制图功能。 在一个薄客户端架构。 mxGraph 还包括后端功能。NET,PHP 和 Java 提供的大多数服务器之间的访问图模型和持久性 技术。该软件是唯一可用的 mxGraph 许可的条件下, 标准商业许可证的。评价是 mxGraph 网站上可用。 1.4.4 jgraph 的发牌 核心 JGraph 的库是开源软件。这意味着源代码是免费的 可用。在写作的时候发牌的各个组成部分是: JGraph 的 - 库通用公共许可证(LGPL)2.1 版和 JGraph 的 许可证 1.1 版。 JGraph 的布局 PRO - JGraph 的许可证 1.1 版。 JGraph 的布局 Pro 也是免费的 用于非商业的学术风格的许可证的条款下使用。 ?JGraphpad - 库通用公共许可证(LGPL)2.1 版和 JGraph 的 许可证 1.1 版。 在 LGPL 协议下的核心 JGraph 的库是免费提供。在 LGPL 指出, 如果你分发的,必须提供访问的源代码 JGraph 的(只 JGraph 的) JGraph 的应用程序,使用图书馆。如果您更改 jgraph 的或扩展, 还必须提供这些变化。非 JGraph 的部分应用程序不能算作 一个扩展,你可能仍然保持私人的代码。请注意,添加评论 用户文档的源代码,JGraph 的可能会发现在把 JGraph 网站并不构成遵守 LGPL 的。 详细的授权问题,您应咨询法律专业人士。 第 15 页 JGraph 的用户手册 1.5 入门 1.5.1 JGraph 网站

从与导航的 JGraph 网站的。最有用的领域,你什么时候开始 JGraph 的在下面列出。使用导航栏的左边找到 相应的部分: ?文件 - 有关 JGraph 的所有免费提供的文件。如果你正在阅读 这是把 JGraph 用户手册的一部分,这是最先进的最新文档 写作的时候。 JGraph 的是在一个小的费用,额外的例子 展示特定功能的 JGraph 的。 ?论坛 - 在这里,你可以要求把 JGraph 的问题。及时, 正确的答案不能保证,但是把 JGraph 的开发者倾向于保持 闭目问题上发表。尝试打破你的问题分解成单个小的 的问题。如果您发布的要求有人为你写你的项目,你是 不可能收到回复。如果您需要商业级支持,请联系 support@jgraph.com。在张贴的论坛之前,请搜索文档, 常见问题和使用的搜索提供搜索论坛。 JGraph 的团队 已经花了很大的精力把这些资源,请尝试保存 它们指向你,因为你没有搜索自己。 注意:大部分的论坛用户问足够多的问题,但回答。 没有。 JGraph 的成立是一个社区项目,它是合理的 最初有一些问题,你可能会问,4 个或 5 个问题 不给予任何回报。但继续问超过 10-15 没有提供任何回报会注意到的问题 JGraph 的开发者,你会发现帮助你在这种情况下,他们将停止。如果 你不知道在哪里,看通过未回答的问题 论坛的一个开始。 ?常见问题 - FAQ 包含了一些最经常收到的问题的总结 格式。 ?跟踪 - 跟踪包含当前内 JGraph 的错误。如果你认为你有一个 错误,请检查尚未报告,并检查,如果你在论坛 不能确定它是否是一个真正的错误。如果你知道,请做报告的 bug。 1.5.2 DOWNLOADING jgraph 的 完整的 JGraph 的套件包括所有可用的组件下载。这些 JGraph 的,主库,JGraph 的布局 Pro 后,一个额外的库,包括布局 和分析功能,建立直 JGraph 的顶部。最后,有 JGraphpad, 示例应用程序建立在 JGraph 的顶部。 JGraph 的网站上下载页面上,你可以找到最新的无铅封装 ,无论是源代码和二进制分布。 JGraph 的是较旧版本 JGraph 的 sourceforge 网站。需要注意的是把 JGraph SourceForge 页面一直没有 积极维持了好几年,获得旧版本以外,本网站不应该 被使用。 第 16 页 JGraph 的用户手册 请注意,JGraph 的最新版本的下载上 JGraph.com 网提供 站点位于与商业级的带宽在一个专用的 JGraph 的下载服务器 和更好的运行时间比 sourceforge.net 服务器。 JGraph.com 应该是您的首选

下载位置,这个原因。 JGraphpad 可从相同的下载 页。 1.5.3 安装 jgraph 的 在下载三个 JGraph 的包中选择一个文件夹,将根 开发文件夹在您的硬盘上的某个地方。 JGraph 的是装在一个自解压 jar 文件。双单击该文件在 Windows 通常将开始安装过程。对 开始安装的命令行中键入: >的 java-jar jgraph 的 5_12_3_0,src.jar 更换适当的。jar 文件名。首次出现一个对话框,询问您是否同意 许可下,你会使用 JGraph 的,我们建议您阅读许可。接着,对 安装过程中会提示你选择安装目录 JGraph 的。 1.5.4 项目结构和构建选项 一旦 Java 和 Ant 的安装启动命令提示符窗口或 shell 在* nix 或 Mac 的终端,导航到你的根文件夹安装了 JGraph 的布局。 输入 ant 命令,其中命令是在 Ant 构建文件的目标之一, 执行该命令的功能,如下文所述。错过了该命令将 建立预设的目标,所有的。 例如,编译和运行示例 UI 键入以下内容: 蚂蚁的例子 1.6 JGraph 的设计 JGraph 的库的核心是设计要尽可能小,使用熟悉的 Swing 设计 的原则,离开特定于应用程序的想法示范的例子以外的 核心包和类扩展的核心,通过提供的新功能 库。 第 18 页 JGraph 的用户手册 2 JGraph 的图模型 2.1 重要应用笔记 从 Java 6 更新 10,XOR 被打破,因为在 Sun Windows 执行 默认情况下,从这个组建起,D3D(Direct3D 的)。这意味着应用程序 使用 JGraph 的(默认情况下使用 XOR 画的),需要把 D3D 标志开始 的应用程序。没有什么可以做,在图书馆纠正。您可以 找到更多的细节上 JGraph 的的 XOR 画问题论坛主题。 Java 6 更新 14 个固定 这个问题。 除非造成额外的大小与您的应用程序捆绑一个特定的 JRE 是一个问题, 捆扎应用于为用户提供一致的体验。 2.2 了解 HelloWorld 应用程序 在本章中,我们将通过一个简单的 Hello World 应用程序的每一行 说明正在使用的主类和主 API 用于创建和操纵 简单的图形。包语句和进口省略,则假设你熟悉 Java 基础:

public class HelloWorld { public static void main(String[] args) { GraphModel model = new DefaultGraphModel(); GraphLayoutCache view = new GraphLayoutCache(model, new DefaultCellViewFactory()); JGraph graph = new JGraph(model, view); DefaultGraphCell[] cells = new DefaultGraphCell[3]; cells[0] = new DefaultGraphCell(new String("Hello")); GraphConstants.setBounds(cells[0].getAttributes(), new Rectangle2D.Double(20,20,40,20)); GraphConstants.setGradientColor( cells[0].getAttributes(), Color.orange); GraphConstants.setOpaque(cells[0].getAttributes(), true); DefaultPort port0 = new DefaultPort(); cells[0].add(port0); cells[1] = new DefaultGraphCell(new String("World")); GraphConstants.setBounds(cells[1].getAttributes(), new Rectangle2D.Double(140,140,40,20)); GraphConstants.setGradientColor( cells[1].getAttributes(), Color.red); GraphConstants.setOpaque(cells[1].getAttributes(), true); DefaultPort port1 = new DefaultPort(); cells[1].add(port1); DefaultEdge edge = new DefaultEdge(); edge.setSource(cells[0].getChildAt(0)); edge.setTarget(cells[1].getChildAt(0)); cells[2] = edge; int arrow = GraphConstants.ARROW_CLASSIC; GraphConstants.setLineEnd(edge.getAttributes(), arrow); GraphConstants.setEndFill(edge.getAttributes(), true); graph.getGraphLayoutCache().insert(cells); JFrame frame = new JFrame(); frame.getContentPane().add(new JScrollPane(graph)); frame.pack(); frame.setVisible(true); } }

摆动复习 - Swing用一个容器层次结构提供了一种简单的方法,把

任何数量的标准组件到应用程序中。许多的主窗口 的应用程序被称为一帧(的Swing的JFrame)。它被称为一个顶层 容器中,这组包括对话框(的JDialog)和小程序(JApplet的)。 面板(JPanel中),有时也被称为面板,中间是一个典型的容器。这些 协助定位的一些基本的Swing组件,以及提供共同的 的功能,如滚动(JScrollPane中)和标签式元素(JTabbedPane的)。的Toplevel 容器内的中间容器称为内容窗格中,可见 添加内容。在上面的HelloWorld示例,一个滚动的窗格被添加到该 内容窗格中。 在最低的水平在于原子的组成部分。标签(JLabel的),表(表格) 此类别的许多组件树(JTree的)有一些。这些 组件提供了具体的显示和/或输入的功能,并且不一定 嵌入进一步部件。 JGraph的是一个原子组件,它设计成 的方式使用,并提供了一个API,是一致的,尽可能地与其他Swing 原子组件。将组件添加到容器中,无论是在施工 的容器,在容器上调用add()方法。 在HelloWorld例子中,特别是最后4行,JGraph的实例被传递给 JScrollPane的建设,整个事情的内容窗格中可见 的主框架。 第20页 JGraph的用户手册 2.2.1创建把JGraph 把JGraph库的最核心的是org.jgraph.JGraph类。把JGraph 类继承自JComponent,您可以创建一个JGraph的每个图形组件的实例 您的应用程序,以同样的方式,因为你有一个标签JLabel的。该实例 类绑定的图模型,任何图形视图(S),和处理所有的用户界面控制 聚集在一处。不带任何参数创建一个创建一个JGraph的实例 例如一个非常基本的UML图的JGraph的体系结构图: public class Example { public static void main(String[] args) { JGraph graph = new JGraph(); JFrame frame = new JFrame(); frame.getContentPane().add(new JScrollPane(graph)); frame.pack(); frame.setVisible(true); } }

但是,这不是我们的目的非常丰富的。相反,在我们的例子中,我们创建 一个模型的图形,使用缺省的实现,DefaultGraphModel。 然后,我们通过把JGraph的构造函数为代表的数据模型,我们希望这个模型 使用以描述图形。我们还创建了一个默认实现的一个图形视图, 把JGraph GraphLayoutCache,并告知这是认为将会被使用(不 担心现在的单元格视图工厂): GraphModel model = new DefaultGraphModel(); GraphLayoutCache view = new GraphLayoutCache(model, new DefaultCellViewFactory()); JGraph graph = new JGraph(model, view) 信息 - 通常被认为 GraphLayoutCache 的图形视图,并在 JGraph 的以前版本被命名为 GraphView。长期布局缓存的原因 是 JTree 的一类名为 AbstractLayoutCache,保存有关 树节点的几何形状。该 GraphLayoutCache 是不同的标准视图 第 21 页 JGraph 的用户手册 swing,因为它包含的信息,仅存储在视图,也就是说,它是有状态的。这是 时,指的可能是什么,从现在开始,我们将使用这个词 GraphLayoutCache 想到的图形视图。 如果模型和视图是不熟悉的,这是值得得到一个基本的概述 从文字,如[REF]。简单来说,模型持有有关图形的数据,并 提供各种方法来访问这些数据。的视图(s)是逻辑上的一个或多个层 以上执行的任务的视觉上呈现图形,而这些被更新的模型 时自动模型数据的变化。默认情况下,视图将显示在同一张图,但 各种功能可以在每个视图中显示不同的图形, 需要。这是可能的模型,包含所有所需的信息来表示 图表逻辑结构,其几何布局和可视化表示。其中一些 方面,预计将只被认为是图中的意见,但图挥杆 由于任何标准 Swing 组件的成分是比较复杂

细胞定位提供几乎无限的灵活性。 JGraph 的 1.0 版更多 重量上存储的视觉属性在模型上的意见,JGraph 的 2.0 扭转了这一 通用的可视化属性转移到模型中,被认为是更好的解决方案 建筑物。

信息 - 对于简单的应用程序,它是诱人的,以避免GraphLayoutCache 完全和工作直接对的而GraphModel,作为,而GraphModel提供所有 必要的方法来操作的图形。您的建议,除非你有一个坚实 技术的理解和充分的理由,否则,开始一直在努力 GraphLayoutCache。人们经常发现,他们的应用程序的增长,这一观点特定 功能是必需的,所有的呼叫的而GraphModel有改为调用 GraphLayoutCache。这个原则的一个重要的例外是,如果你编辑() 无形细胞在GraphLayoutCache,它变为可见。在这种情况下编辑 模型是可取的。在第4章中进一步讨论的GraphLayoutCache。 第22页 JGraph的用户手册 在第3行的main()成立JGraph的最后4行之间 在应用程序中显示的JGraph的,就在于创建的图形细胞,配置的代码, 并把它们插入到图形中。我们来看看他们的秩序。 2.2.2 INSERTING细胞 这三个图形细胞,我们要创建的HelloWorld应用程序中有两个 顶点和一个边缘连接的顶点:

图10:基本 HelloWorld的例子显示了由一个边缘连接两个顶点

cells[0] = new DefaultGraphCell(new String("Hello")); ... DefaultPort port0 = new DefaultPort(); cells[0].add(port0); port0.setParent(cells[0]); ... DefaultEdge edge = new DefaultEdge(); 我们可以创建新的简单的顶点由的建设 DefaultGraphCells 和边缘 DefaultEdge。这些类可以不带任何参数,或对象实例化。 默认情况下,无论是在它的 toString()方法的对象返回将显示为文本 该顶点或边缘。显然,String 对象返回自己的 toString()和 使用此参数,有时这是唯一的对象。在我们的 HelloWorld 示例 使用这个机制来分配一个顶点标签为“Hello”和其他顶点的标签 “世界”。 其他的对象,DefaultPort,可能会造成混乱,如果你是熟悉图 理论。端口用来表示一个顶点上哪里的地方是一个人工此外,在 JGraph 的 边缘可以连接到该顶点。通过这些端口连接到顶点的两端边缘 和港口表示,至少在默认情况下提供 JGraph 的模型,作为 一个顶点的孩子。在 add()和 setParent()调用中使用的机制 JGraph 的中表明的顶点和它的端口(S)之间的父/子关系。 设置顶点和边,以显示我们希望他们可以通过修改 它们的属性。所有细胞,包括港口,有什么是所谓的属性映射。这是一个 java.util.Map 中,JGraph 的默认执行属性图,AttributeMap, 第 23 页 JGraph 的用户手册 是地图的一个子类。确保你了解 Java 映射是如何操作和基本的 API 使用属性映射。属性中存储的键/值对,其中键是 属性,如颜色,位置和字体。值得注意的是,在这一点上,你看看 org.jgraph.GraphConstants 类。 GraphConstants 是一个工具类设计,让你在访问属性映射 类型安全的方式,即确保您使用的是正确的对象类型的可用 属性。它还提供了一个有用的获得什么样的属性可以被设置为各种细胞 类型。在 GraphConstants,在一些最初的枚举变量,你会发现一个列表 字符串,表示可能的属性映射的键。源的下半部分 文件,大致包含了所有的存取方法(getXXX()和 setXXX()方法) 你应该在你的应用程序中使用的读取和更改的属性。这些的 Javadoc 方法和关键字符串是最先进的日期和完整的描述, 迅速成为这样的引用,避免重复他们在像这样的文件 过时了。

2.2.2.1 配置单元的属性,然后插入 所有图形细胞有一个存储地图,你可以得到使用的 getAttributes()。何时 插入细胞可以获取到该单元格的属性图,并对其进行操作 然后再插入到图形中的细胞。这种做法一般只建议用于插入 细胞,编辑时,细胞的过程中,使用传输地图,而不是实际的单元格的图(在 存储地图)应使用(见编辑走势图)。呼叫,作为一个例子,下面是 第一个单元格设置渐变色为橙色。从细胞的属性映射 获得的 getAttributes(),建设确保您的 DefaultGraphCell 收到一个非空的地图。然后在 GraphConstants 相应的 setter 方法被称为 通过在地图和新的值来设置: GraphConstants.setGradientColor(细胞[0]。的 getAttributes(), Color.orange); 第 24 页 图 11:键/值对的单元格属性描述的细胞 视觉属性 JGraph 的用户手册 另一个例子是: GraphConstants.setBounds(细胞[0]。的 getAttributes(),新 Rectangle2D.Double(20,20,40,20)); 单元格的边界是什么,你会遇到多次使用 JGraph 的,尤其是 定义的 setBounds()方法时,将在图中的任何单元格。一个单元格的边界是 完全包围细胞的最小矩形。另外,在上述的例子中一个新的双 创建精确的矩形,并施加到的小区,使用定义的 setBounds()方法。 “ 的 x,y 坐标被设定为(20,20),该单元格的宽度为 40 至 20 的高度。 将属性应用到边缘的过程中是相同的,如在本例中所示: 箭头= GraphConstants.ARROW_CLASSIC; GraphConstants.setLineEnd(edge.getAttributes(),箭头); GraphConstants.setEndFill(edge.getAttributes(),TRUE); 这里的线端设置的是一个标准的箭头和创造的端部形状 EDGE 技术。需要注意的是边缘都有一个内部 JGraph 的方向,它是由你 是否要揭示这种行为上可见图。这也是值得 指出了存取方法经常只适用于一个或有限数量的类型 的细胞。设置一个顶点的线端是毫无意义的,因为什么都不会发生 ,没有错误所造成的性能的原因做这样的事情,因为没有伤害会 来的吧。的状态时,他们的 Javadoc 的方法只适用于特定的细胞类型(S)。 在边缘连接,在我们的例子中,这些都是线 执行此功能; edge.setSource(细胞[0]。getChildAt(0)); edge.setTarget(单元[1]。getChildAt(0)); 如前所述,边缘有方向,内部,并通过端口连接到顶点 分配给那些顶点。边缘可以被看作是从源到目标。 “ 方法 setSource()和的 setTarget()的边缘界面上指定端口,每个端口 端部的边缘连接。在该示例中,已取得的端口从顶点 问他们的第一个孩子。 getChildAt(int)返回指定的索引的孩子

单个参数。我们知道有一个孩子,因为我们创建连接到每个顶点 端口和分配给他们的孩子以前。注意,此方法确定 端口是足够在我们的例子中,但有时不是一种好的编程实践时,我们 取得不平凡的申请,涉及多个端口。 我们的细胞,配置和连接边缘的顶点,我们可以 现在插入到图: graph.getGraphLayoutCache()。插入(细胞); 我们将永远在我们的例子中,插入的 GraphLayoutCache 工作,编辑 除去细胞。你会发现有一些变种的插入方法和 示出一个是最简单的。它带有一个数组的顶点和边,并将其插入到 图。尝试运行 HelloWorld 示例提供的 JGraph 的包。详细信息 第 25 页 JGraph 的用户手册 如何做到这一点是在介绍“一章。该代码是略有不同,但 功能是相同的。 尝试的 HelloWorld 玩了一会儿,看看有什么简单的功能 JGraph 的程式库提供给你。选择了一个顶点,什么是所谓的手柄周围出现 顶点。您可以拖动手柄来调整顶点,或单击并拖动的主要部分 顶点移动。双击一个顶点,使一个简单的编辑器,可以让你改变 的标签,你可以做同样的边缘。单击并按住鼠标附近 左上角的图形区域,拖动鼠标向右下角的图形和 释放。拖动过程中形成的矩形,该矩形被称为一个选取框,释放 鼠标使所有三个单元格被选中,如果选取框完全重叠的细胞。 拖动任何部分的选择会导致整个选择移动一次。功能 有关这选取框的 BasicMarqueeHandler 处理。 2.2.3 编辑图表细胞 改变图形时,您所做的更改收集在一个嵌套的地图,并把它传递给 GraphLayoutCache.edit()。这将整理出的改变您的看法,将它传递给 模型中,创建一个不可撤消的编辑您的撤消命令历史记录,并刷新一切, 需要刷新。例如: 地图嵌套=新的 Hashtable(); 和地图 attributeMap1 =新的 Hashtable(); 嵌套的地图是地图编辑()的第一个参数传递到。 attributeMap1 包含在一个特定的细胞,我们要编辑的属性的详细信息。比方说,我们要 改变一个细胞的 lineColor: GraphConstants.setLineColor(attributeMap1,Color.orange); 同样,GraphConstants 用于指示属性设置。但是有一个区别 新的 HelloWorld 例子。而不是获取属性映射属于 任何一个地图,一个新的 Hashtable 已建成。这是为什么不同的操作 在插入过程中的属性映射将简要说明。 您可以创建属性映射描述的属性更改为任意数量的细胞。 每个属性图描述了一个细胞的所有变更。如果你的一个细胞分裂的变化 在许多地图,这将仍然工作,但效率不高。下一步我们的属性 图,假设我们只需要设置它的颜色,是把()的嵌套的属性映射到

地图。当你这样做,你要改变的单元格的属性映射的关键, 即这种细胞是让这些属性的变化。 nested.put(CELL1 attributeMap1); 您不必调用 Edit()的嵌套地图只是还没有,事实上,它可能是一个坏主意 这样做。调用 Edit()添加,编辑撤消历史记录,所以如果你想一些 事情要分成一个撤消,确保他们作为一个编辑()。 第 26 页 JGraph 的用户手册 所以,也许你想到另一个边缘上的标签,以平躺沿的边缘,这 是相同的原子变化的一部分; 地图 attributeMap2 =新的 Hashtable(); GraphConstants.setLabelAlongEdge(attributeMap2,TRUE); nested.put(单元格 2,attributeMap2); 等。最后我们通过嵌套的地图进入编辑(),你应该找到生成的 图相应的改变。 graph.getgraphLayoutCache()。编辑(嵌套,NULL,NULL,NULL); 当编辑你不应该修改的属性直接的细胞,你应该存储 一个新的地图,并要求他们为你 JGraph 的应用。这种机制不 必要时,插入,因为细胞(S)有没有要改变现有的属性映射。 当插入,编辑或删除呼叫时,图模型创建了一个对象,它描述 的变化,以进行,这个对象被称为编辑。编辑上执行 当前状态的曲线图,以确定将所得图。抽象化的原因 转变成一个实际的对象有两个方面:1)提供执行的事件监听器 第 27 页 图 12:编辑调用传递到一个嵌套的属性图表示。进入嵌套的 地图是表示以被改变的细胞,并在地图上的属性更改在该单元格的键/值对。 在该第二个属性图是一组键/值对的代表键从 GraphConstants 类的 这些视觉属性的新值将被分配由这个编辑打电话。 JGraph 的用户手册 编辑闪光的手段来获取信息编辑,发生了什么事)提供 撤消支持内 JGraph 的存储编辑的撤消历史记录。 编辑()检查请求的图形状态的变化要求对当前的图形 状态。如果被发现没有变化要求,不采取任何行动。如果您编辑 对细胞的属性,在属性前一个编辑的地图,属性映射通过将 那些目前持有由细胞进行核对,并发现是相同的。这是 因为他们将同一个对象,所以编辑()不会改变,因为它看到的图 在变更申请中的没有什么不同。创建新的地图,通过这个过程的原因 进入编辑()的调用是没有必要的插入()调用的是,插入细胞不存在 在图等,有没有属性图做比较。如果你不喜欢 两种不同的方法(简单的插入件和嵌套的地图)的配置属性,使用 嵌套的哈希表是可能的,这两种方法。然而,在插入编辑 提供更好的性能。调用相应的插入会是: graph.getGraphLayoutCache()。插入(嵌套,NULL,NULL,NULL); 有一对夫妇的属性映射的项目所使用的术语。永久地图

与一个单元被称为存储映射,并需要使用一个专门的属性 地图类。仅用于显示编辑的变化,然后被丢弃是一个临时的地图 称为一个传输地图,最通用的地图的实现可以用于此目的。 2.2.3.1 删除单元属性 在 JGraph 的一个常见的错误是使用细胞属性直接映射,因为 完全删除属性的属性映射的机制是不那么明显。 因此,用户可以直接在地图中删除相应的键和调用 Edit()。 “ 正确的方式做,这是到调用 setRemoveAttribute(): 键的 Object [] =新的对象[] {GraphConstants.ICON}; GraphConstants.setRemoveAttributes(地图,键); 本示例将删除的图标从一个细胞的关键属性映射。可能的密钥集合 您可以通过在与阵列是在顶部的 GraphConstants 类。请记住, 所有拆下的属性设置一次,因为任何新的阵列将覆盖以前的条目。 另外,取出该数组使用 getRemoveAttributes(),复制以前的值 到一个新的阵列,同时也增加了新的价值,并通过新的数组 setRemoveAttributes()方法。 2.2.4 删除单元 其余的基本图形的编辑操作,除去细胞。最简单的 remove()方法接受一个数组的细胞被删除。喜欢的 insert()和 remove(), 这种方法是可在模型和布局高速缓存级别。特别考虑 删除分组的细胞时,需要给予更多详细信息,请参阅第 4 章。 第 28 页 JGraph 的用户手册 2.2.5 属性映射 的地图,每个单元格的属性拥有被称为一个属性映射。默认的类 内 JGraph 的定义属性映射被命名为 AttributeMap,但总是尝试 访问属性映射使用 Map 接口的封装通常的原因和去耦 从实现的接口。属性的值内举行 在地图上和按键的键/值对是众所周知的常量,绘图 功能理解和解释的值配置为产生的图形 属性决定。 此前提到的是使用的 GraphConstants 类提供的定义 地图的键的默认 JGraph 的实现可以理解的,并提供了一种方法 访问中的值类型安全的方式。例如,实现 setFont() 和 getFont()在 GraphConstants 的样子: 公共静态无效的 setFont(地图地图,字体字型) map.put(字体,字体); } 公共静态的字体 GETFONT(地图地图){ 字体字体(字体)map.get(字体); (字体== NULL) 字体= DEFAULTFONT; 返回字体; }

请注意,该方法是静态的,您可以指定地图,他们是采取行动的参数 列表。这些方法确保该类型值对象存储下的关键 GraphConstants.FONT 是一个字体。 getFont()方法的情况下,该方法还可以确保 一个使用默认字体,如果没有特定的细胞不具有字体集。在另一部分的 JGraph 的库,处理绘图标签上的顶点和边的部分的值 getFont()方法将通过在相应的单元格的属性映射和使用 正确渲染标签。 应当指出,GraphConstants 中定义的属性映射的键涉及几乎 完全的视觉特性的细胞。一般在 JGraph 的,如果用户想增加新的 属性,那么只有视觉属性(例如颜色)和可视化控件的属性 (例如选择)应该被添加到一个自定义的类,它提供适当的 关键的常数,以及静态的 setXXX()和 getXXX()方法。有一件事要 记住的是,属性是不可撤销的,这可能会影响你是否可能它的属性 或将它与你的另一种方式。没有这个自定义类的要求 是一个子类的 GraphConstants,,因为几乎所有在这个类中的静态 定义。在第 3 章的主题自定义的非可视化的数据关联与细胞 在讨论小区用户对象。 2.2.5.1 属性地图编辑后呼叫 标准的方式来改变细胞的属性映射的内容是通过一个新的地图 作为一个嵌套的地图编辑()方法的一部分的单元格中的映射条目的属性。自 第 29 页 JGraph 的用户手册 一个单元格的属性映射已经存在有四种状态可能发生的变化, 个人属性,在属性图: 1。属性将保持不变, 2。该属性被改变时, 3。从地图中移除属性 4。一个新的属性被添加到地图中。 插图形象地显示四个可能的属性条目状态的变化过程中 编辑()调用。黄色框编辑的单元格属性映射前的状态 打电话和绿色通过在编辑框的属性地图()调用在一个嵌套的地图。 1。界属性是不是在传输地图,所以保持不变在后编辑 存储映射。 2。将 AutoSize 属性是在预编辑存储地图和交通地图。在 这种情况下编辑后的存储映射持有的价值,通过交通地图通过。 3。交通地图保存一个对象数组的值的 REMOVEATTRIBUTES 键。 这实际上是一个 String,这个数组有一个元素,GraphConstants.SELECTABLE 值“可选”。编辑呼叫检查,以查看所引用的关键是在预编辑 存储映射。这是我们的榜样,这样的映射条目被删除后编辑 存储映射。 4。的不透明属性是目前的交通地图,但不预编辑存储映射。 复制到编辑后存储映射的键值对。 第 30 页 插图 13:通过编辑调用的交通地图如何影响细胞的存储映射。

JGraph 的用户手册 2.2.6 复杂的交易 有些时候,你需要将几个插入,编辑和/或删除成一个单一的 更改。图模型交易的概念版本 5.12.4.0。调用 beginUpdate(),上而 GraphModel 内部事务计数器递增。 调用 endUpate()方法递减计数器,如果递减导致它达到 0 所有的插入,修改和删除的模型,从最初开始的呼叫 去年年底更新的采取行动。这将产生一个单一的撤消和引起的变化 被解雇的事件和图形重新绘制后,最终 endUpate()方法。 graphModel.beginUpdate()/ /计数= 1 graphModel.insert(...); graphModel.beginUpdate()/ /计数= 2 graphModel.edit(......); graphModel.endUpdate()/ /计数= 1 graphModel.remove(...); graphModel.edit(...); graphModel.endUpdate()/ /计数= 0 在上面的例子中,直到最后 endUpate()方法调用的 4 个模式的转变 采取行动。这允许抽象模型更改成,例如,包装的方法 的开始/结束更新呼叫,然后,可以使用较大的交易的一部分。 请注意,该交易在该序列中,它适用于被调用时,如果有一个冲突。如果以后 编辑修改的相同属性较早的编辑改变一个单元格,后来的变化。 另外,请注意,上述交易系统模型仅适用于在当前时间,则 不能作为交易的一部分作出 GraphLayoutCache 的通话,也没有在 GraphLayoutCache 已开始/结束更新方法。 2.2.7 总结 在本节中,我们看到了插入到图形模型的细胞和操作。 每个细胞都有一个用来描述它的外观和行为的属性映射。使用 插入(),编辑()和 remove()方法,我们可以 GraphLayoutCache 改变细胞图模型更新的方式,在屏幕上正确地重新绘制, 撤消的变化是添加到撤消历史和所有听众的模型被告知 但这种变化。这些方法通常被称为 3 编辑方法,它是作为 值得记住的是,它们形成的 JGraph 的 API 的关键部件之一。当前有 不存在方法的而 GraphModel 接口执行的化合物 3 编辑 在一个原子的,不可撤销的方法,使插入,属性编辑和删除 操作。 第 31 页 JGraph 的用户手册 2.3 创建和配置 JGraph 类 JGraph 类本身联系在一起的图的主要组成部分,提供顶级 结构的通用性的方法的图形和一个数。模型 - 视图 JGraph 的模式如下所示: JGraph 的是一个 JComponent 和引用的模型,视图和 UI。基本 结构的组成部分,即 Swing 的 MVC 架构,是继承 JTree 的。

然而,JGraph 的有一个额外的参考的曲线图的布局高速缓存,这是通常不 使用 Swing 中的 MVC。图形布局缓存是类似 Swing 的文本的根视图 组件,但它引用的 UI 委托。相反,它是所引用的 JGraph 对象,它保存时的状态改变的外观和感觉。 创建您的 JGraph 的实例和关联对象时,重要的是要得到 对象的创建顺序正确,并确保正确地相互引用的对象 在适当情况下。 JGraph 的,以的电流而 GraphModel 和引用 GraphLayoutCache GraphLayoutCache 需要有一个参考的 而 GraphModel。实例化一个 JGraph 的最简单的方法是: JGraph 的图表=新 JGraph 的(); 这将创建一个 DefaultGraphModel 和你 GraphLayoutCache 在新的模型参考在 GraphLayoutCache 的指向。说,例如, 你有你自己的图模型,使用方法: 而 GraphModel 模型的新 MyGraphModel(); JGraph 的图=新的 JGraph 的(模型); 正确的 GraphLayoutCache 将成立以同样的方式和以前一样。 接下来,你自己 GraphLayoutCache: 而 GraphModel 模型的新 DefaultGraphModel(); =新 GraphLayoutCache 视图 MyGraphLayoutCache(模型, 第 32 页 图 14:JGraph 的 MVC JGraph 的用户手册 新 DefaultCellViewFactory()); JGraph 的图=新的 JGraph 的(模型,视图); 你可以传递 null 作为第一个参数到的 MyGraphLayoutCache(请注意,我们 假设您的自定义缓存对象的构造函数具有相同签名 GraphLayoutCache)和将创建一个 DefaultGraphModel,和所有的 为您设置的参考。然而,明确建立模型,并通过使 代码更清晰。当然,最后的排列是自定义模型和布局缓存。 简单地使用自己的模型在地方的 DefaultGraphModel 在最后一个例子 上述实现这一目标。 需要保持正确的引用的另一个领域是,当模型或 布局缓存后更改已建成的 JGraph 的。要做到这一点使用 通过 setModel()和 setGraphLayoutCache()方法,JGraph 类 新的模型和布局缓存实例。当设置任何布局模型缓存 目前与 JGraph 的实例将被更新,以使用新的模型,而不是。 当设置一个新的布局缓存,相关联的模型与布局高速缓存将被传递 jgraph.setModel()自动。如果你想保持当前的模型 把 JGraph 实例相关联的,你应该创建新的布局缓存,并通过 当前的模型前给它的构造函数传递的布局高速缓存 jgraph.setGraphLayoutCache()。 2.3.1 配置 jgraph 的 许多 JGraph 的主要功能可以启用或禁用通过把 JGraph

类。下面是一个列表的配置方法值得学习,请注意,有些是继承 从超类。不是所有的配置在 JGraph 的方法在下面列出。一些 别人会在后面的章节中介绍。请记住这些存取方法, 每个有相应的设置方法,或方法。如果您想尝试 提到的任何 set 方法的影响,尝试运用他们的 JGraph 的实例 在 HelloWorld,就在你创建它。 的 setEnabled(boolean)来 JGraph 的最高级别的配置( 方法实际上是在 Jcomponent)。这判断是否鼠标事件 被处理。当设置为 false,这将禁用的选择,运动细胞,编辑标签, 调整大小,任何需要鼠标交互。基本变量是真实的 默认值。 ?SetEditable(Boolean)确定是否顶点和边的可能 进行编辑。编辑不应该混淆与启用,编辑是指仅与 过程中的曲线图上点击一组的次数(见 setEditClickCount())带来了一个编辑器中的地方(上方或周围的顶点 ),允许细胞标签的字符串内容被改变。基础变量 默认值是 true。 第 33 页 JGraph 的用户手册 ?setEditClickCount(INT)的数量决定的时间,你必须按一下 之前的编辑器,在编辑单元格(默认情况下,所允许的字符串标签) 标签被调用。基础变量的默认值为 2,即双击编辑。 ?SetMovable(布尔值)确定是否可能是顶点和边 感动。注意端口不能移动的默认实现在任何时候。 “ 相关变量的默认值是 true。 ?SetConnectable(boolean)来决定是否有新的连接 允许建立。请注意,这仅适用于连接操作 在 GUI 中进行的,试图以编程方式连接的边缘仍然会工作 即使设置禁用此方法。如果您尝试在 HelloWorld 例子中, 图中出现的边缘连接。您仍然可以通过选择断开的边缘 的边缘,然后点击和拖动的边缘的一端,远离所附 顶点。不过,如果你尝试拖动到顶点的边后卫有没有办法 重新连接它如果你调用 setConnectable 的(假)。基本的 默认情况下,变量是真实的。 ?SetDisconnectable(boolean)来决定是否连接的边 可能会断开其连接的顶点。具体来说,你可以抓住年底 边缘附着到顶点,将它从它的附着点。 JGraph 的基础 工作流编辑器的应用程序,如经常不允许断开的边缘,所以使用 这种方法执行的行为。基础变量默认值是 true,即 边可能会被断开。 ?SetDisconnectOnMove(boolean)来决定是否连接 边缘移动时,应当断开。这是不同的 setDisconnectable 的,因为它涉及到移动的边缘作为一个整体,而不是 一个端部的边缘。的基础变量默认为 false。

?SetGridEnabled(boolean)来确定是否细胞'啪' 特别是在图中的位置,形成一个更经常的结构。的概念的 网格是,数点作为整个图形坐标空间被布置 在其最近的网格点,这个过程命名捕捉网格和细胞定位。 由每个点之间的距离,可以将网格配置。基本的 变量默认为 false,即细胞中插入或移动到双精度坐标 而不是移动到网格位置。 第 34 页 JGraph 的用户手册 ?setGridVisible(布尔值)确定是否在网格是可见的。如果 setGridEnabled 设置为 true,你'抢购'网格点,否则不 “抢购”就会发生。 ?SetMoveBelowZero(布尔值)判定是否允许细胞 有其左上角的在负坐标空间的任何地方的位置。它 一般建议不要让这一点,除非有一个很好的理由。 “ 基础变量默认为 false,即所有最左上角的单元格总是在 正坐标空间。 ?SetAntiAliased(boolean)来决定是否启用抗锯齿 JGraph 的组成部分。抗锯齿是一种技术,模糊尖锐, 锯齿线,使用颜色渐变。的基础变量默认为 false。 ?SetSelectionEnabled(boolean)来决定是否任何细胞可 被选中。基础变量默认值是 true。 第 35 页 JGraph 的用户手册 2.4 图模型 2.4.1.1 简介 存储的逻辑结构的图模型的曲线图,并适合与 MVC

2.4 图模型 2.4.1.1 简介 存储的逻辑结构的图模型的曲线图,并适合与 MVC 想法,一个对象的数据被存储在模型中。而 GraphModel 定义 接口的对象,可作为在图表的数据源。此接口使然, 的程度,如何描述的图模型的基础数据必须被存储在 实现此接口的类。默认执行的而 GraphModel, 的 DefaultGraphModel,不仅是有用的作为一个有启发性的解释图的工具 模型,也适用于大多数简单的应用程序,使用 JGraph 的。如果您 要自定义的图形模型的行为,你的第一个方法应该是 DefaultGraphModel,即使是非常简单的模型是相当复杂的实现 从头开始。

设计背景 - 有些人有点困惑的存在视觉 信息被间接所存储的,具体而言,该模型的图形单元的属性。 这些属性包括详细信息和控制信息,如定位,renderering 的行为,如细胞是否可以拖动。许多图形库架构 图模型在这样一种方式,它仅图细胞(顶点和边)和关系 细胞之间的被存储。 JGraph 的目标是在图形可视化,比一般的图 分析和作出决定,在它的设计中,使模型代表的 可视化图形,不只是图形结构。这使得更适合图形 API 进行图表分析时,的轻微牺牲性能的可视化。 2.4.1.2 的编辑方法 在 Insert() ,编辑()和删除()方法,而 GraphModel 执行 相应的功能,他们的 GraphLayoutCache 的方法执行,但他们的 参数看起来比较复杂的。这些方法的使用,以及它们相应的 签名在 GraphLayoutCache 方法将覆盖一节中的“高级” 编辑。正如前面提到的,插入,编辑和删除直接到模型 意味着基于该模型将收到的所有意见相同的变化。只使用这 方法意味着多个独立的意见是不可能的,需要决定 认为在规范阶段的应用程序。 2.4.1.3 访问图形模型数据 接下来的方法中要考虑而 GraphModel getRootCount() , getRootAt getIndexOfRoot()() , ,并包含() 。为什么的数据结构的 JGraph 的车型是它是如何和为什么使用这些方法访问的数据结构 需要如何 JTree 的模型已扩展至 JGraph 的知识,以及 第 36 页 JGraph 的用户手册 使用的术语来描述的关系,在一个 JTree 的节点。在此背景 附录 A 中提供的话题 默认情况下,每个顶点或边插入到一个 JGraph 的形成中的一个树的根节点 图中的数据模型。端口,因为它们在逻辑上属于顶点和边的,是孩子的 细胞它们所连接的。因此,如在添加的两个顶点和单边沿 HelloWorld 的例子会导致基层结构看起来像这样: 习惯上是将调用存储顶层的顶点和边的结构,该结构 图根。此名称将在本手册中,结构, 图形数据模型结构。基层结构是技术上的森林 连接的树木。的树木时,可以变得更加复杂,处理分组的细胞,但 这将包括在以后的章节。 现在应该很清楚,从上面的图中,什么功能的四种方法 提到执行: ?getRootCount()返回的元素数量的基层结构,这 将返回 3 在上面的例子。 ?getRootAt(int)的一个整数参数,并返回该元素 在根部结构指数。请注意,这意味着,根是一个有序的 收集和的件数的功能,这是至关重要的,JGraph 的

的规定。需要的根部结构的导航的方法, getRootAt()是目前最常用的,所以也最性能敏感的 方法通常。这是因为这个原因,根 DefaultGraphModel ArrayList 中,默认情况下,使这种方法在常数时间内完成。调用 getRootAt(1)将返回上面的图中的顶点的 Vertex2 表示。 该公约是根中的第一个条目有一个指数为零。 ?getIndexOfRoot(对象)返回的基层结构中的单元格的索引。 传递到 EDGE1 在上面的图对应的对象将返回 2。如果 根中不包含的对象,该方法返回-1。 ?包含返回一个布尔值,指示是否指定的对象(对象) 内可找到根。 第 37 页 图 15:运行后的 HelloWorld 应用程序的根结构表示。 插入根和港口的顶点和边的细胞,他们的孩子 逻辑的一部分。 JGraph 的用户手册 信息 - 更改根是其他的东西比一个 ArrayList 可以做 一个自定义的图形模式,但也有一些这样的选择的重要原因。如 提到的,getRootAt()是通常的瓶颈的四个方法,并选择 另一个列表类型,甚至地图或设置会导致方法的性能 降低固定的时间,O(1) ,是成正比的项数根,O(| V | + | E |) 。此外,getIndexOfRoot()自然本身使用 IndexOf() 方法的返回值的列表,它的语义匹配。如果设置或地图, 请记住,根必须订购,所以 LinkedHashMap 的和 LinkedHashSet 的 是适当的。他们只在 JDK 1.4 中引入的,任何人使用早期版本 Java 有多少选择,只能使用 ArrayList。 这四种方法来浏览和查询的基层结构形成的基本手段。 还有其他的方法处理的父/子关系,将覆盖 在上一节组。我们应该记住,而 GraphModel 接口 总是被用于访问的图形数据模型结构。该接口提供了手段, 约根获得必要的信息和类型检查是有意弱, 细胞为研究对象,通过细胞的方式是允许完全的灵活性 设计的。此外,访问的根通过而 GraphModel 接口提供独立 从实际的模型实现。如果模型需要一个交换 提供了改进的性能或数据库同步,例如,这可以完成 没有变化的调用代码。 2.4.1.4 克隆的图模型 2.4.1.5 导航连接使用而 GraphModel 接口 对象的 getSource(物体边缘)和对象 getTarget(对象 边缘)方法以而 GraphModel 提出的方法,得到的细胞,如果没有,即任何 特别边缘的连接。请注意边缘隐含有 JGraph 的方向。这不 不排除无向图的可视化。避免了使用 上箭头边缘,在视觉上看起来无向任何图形。 要获得一个 Iterator 连接到一个特定的小区的边缘,边缘(对象

端口) 。虽然,该参数被命名为“端口”而 GraphModel 的接口 不强制执行,只有端口可以连接到边缘。但是, DefaultGraphModel,例如,不执行这条规则。顶点的布置的 有孩子的端口与边缘的连接形式,为广大的最佳设计 图模型。有些时候这是效率不高,例如,图形非常 大量的顶点每个只有一个端口可以是速度,并具有减小的 由结合到一个对象的顶点和端口的存储器。这种模式安排 在后面的章节中解释的性能问题。此外,如果在相同的细胞中要使用 多个模型,每个模型中使用不同的连接关系, 不适合 DefaultGraphModel。这是因为连接关系被存储 在细胞中,使其不可能分别在不同的模型来定义连接。为 第 38 页 JGraph 的用户手册 由于这个原因,建议不要图模型之间共享细胞,这是一个共享的特征 JTreeModels。 布尔物体的边缘(isEdge)和布尔 isPort 的(物件端口) 依赖于实现的方法,必须坚持的想法,边只能连接 使用的端口,该端口允许连接到他们的边缘。 最后的方法,使图中的模型数据元素之间的导航 结构是导航的父/子关系。这些方法也将是 的背景下,在后面的章节进行分组讨论。 ?对象的 getParent(child 对象) ,如果有的话,返回父 指定的单元格中的图形模型的数据结构。在树上,所有的孩子可能只有 一个父。 ?:INT getIndexOfChild(父对象,对象儿)回报 集合中的索引指定的子父持有它的孩子。注意 这个集合必须是确定的,责令。 ?,getChild 对象(对象的父母,诠释指数)返回的孩子 指定索引的集合中的每个家长认为其子女。同样,对于 这种方法是确定性的集合必须是有序的。 ?INT getChildCount(对象母公司)返回的元素数量 指定的单元格集合的儿童。 对于那些熟悉 JTreeModel 你会认识到,导航和 任何在根的一个元素开始的树是几乎相同,所用的机制 JTrees。从这些方法的介绍,我们可以浏览所有元素之间的 图模型,数据结构,父母和孩子之间的连接。现在,我们将 穿行示例代码显示了如何定位各要素之间的使用 只而 GraphModel 接口。对于这一点,我们必须承担一定的实施 图模型因为顶点和端口之间的关系没有明确定义或 隐含的而 GraphModel 接口。为此,我们将使用的 DefaultGraphModel, 端口是独立的对象的顶点和端口始终处于直接的儿童 顶点的一部分。需要注意的是实用的方法来进行下述功能 已经可以在 JGraph 的,下面的例子是为那些希望了解 JGraph 的结构更彻底。之间的关系的一种表示

在下面的图中示出由一个边缘连接的两个顶点。 第 39 页 JGraph 的用户手册 2.4.1.5.1 获取一个顶点相连的边的集合 要获得只使用而 GraphModel 接口,一个顶点的边的集合 循环通过每个端口必须属于这个顶点,然后在每个端口重复 通过每个连接到该端口的边缘: 列表 listEdges =新的 ArrayList(); numChildren 的= model.getChildCount(手机); (INT I = 0;我 numChildren 的,我+ +){ 对象端口 model.getChild(单元,I); (model.isPort(端口) ){ 迭代器 iter:= model.edges(端口); 而(iter.hasNext() ){ listEdges.add(iter.next() ); } } } 请注意,要求一个顶点,如果一个孩子是一个港口,顶点也可以是儿童 的顶点,JGraph 的分组功能的基础。 2.4.1.5.2 获取源和目标顶点的边缘 如果要获取源和目标顶点的边缘通过的端口连接到 顶点,只使用而 GraphModel,你获得在两端的边缘使用的端口 getSource()和 getTarget() ,然后获得这些端口的父母: 和对象 sourceVertex = model.getParent(model.getSource(边缘) ); 和对象 targetVertex = model.getParent(model.getTarget(边缘) ); 第 40 页 图 16:图模型的数据元素之间的关联表示 2 个顶点 1 条边的插入一个 DefaultGraphModel 的连接 JGraph 的用户手册 在 JGraph 的 2.5 设计合同 合理频繁的问题是,为什么有那么多的参数和返回值对象 类型,而不是顶点或边或端口。这涉及到的设计决策,使 合同 JGraph 的需要 adherance 简单和尽可能小的。 “ ,而 GraphModel 接口其他接口库中的主要元素,必须是 遵守。从该扩展: 1。任何对象都可以使用作为一个而 GraphModel 中的单元格。它不是必需的,细胞 实现一个接口。 2。 The Edge 和端口接口仅用于在 DefaultGraphModel。他们是一个 默认的模型和它的细胞之间的合同。 (他们不使用其他任何地方 JGraph 的。 ) 3。图形结构应通过而 GraphModel 接口进行访问,不 通过边缘端口接口。它甚至不是必需的,而 GraphModel 使用端口(

然而,需要由在模型中的对象)表示每个边沿。 4。本 JGraph 的分量也不是图的遍历算法使用边缘 Port 接口,它们都使用而 GraphModel 接口,这反过来又使用边缘和港口的 从细胞结构的图形界面来检索。通过这种方式,存储结构可以是 隐藏从而 GraphModel 客户端。

3 细胞 3.1 类型的细胞 正如前面所提到的,有三种类型的图细胞 JGraph 的,顶点,边 和端口。顶点形成用户可以看到的主要对象有关的曲线图,正方形, 圆,图标和更复杂的对象为其他 JComponents 等。边缘 通常表示图结构的顶点之间的连接线。你可以有 相同的对顶点,称为平行的边缘,甚至边缘,之间的多个边缘 开始(源)和终点(目标)在相同的顶点,被称为自循环。 上面的图显示了一些顶点和连接边。还可以看到有 小方块,这些都是连接到的顶点和边的端口。端口直观地表示 点,在该边的端部可被连接到顶点或其他边缘。究其原因 有一个逻辑上独立的实体的端口,多个端口可以是固定的(偏移量) 指定顶点的位置,使图形模型数据结构需要区分 在其边界内的不同点之间的连接。 3.2 细胞的接口和默认实现 3.2.1 GRAPHCELL 接口 GraphCell 的接口的图形细胞要坚持。请注意,使用 字。如果需要,可以使用另一个接口和正确使用 而 GraphModel 接口将意味着这种变化的模型的用户是透明的。 然而,许多的应用和扩展 JGraph 的默认界面以及 实现,DefaultGraphModel 例如,假设使用的 GraphCell 接口。除非你有一个很好的理由,否则,你的细胞继承 GraphCell 的层次结构。 第 42 页 图 17:不同的顶点,边缘接合处和 可用的端口可见的小方块 JGraph 的用户手册 顶点被认为是默认情况下,使用的 GraphCell 的接口本身。 被认为是专业的顶点和边和端口,所以有自己的 接口。 GraphCell 本身只提供了两种方法的 getAttributes() setAttributes() 。属性中提到的第 2 章,为的 GraphCell 的 接口表明的,是确定如何细胞出现视觉的关键。这是不可能的,你应该 以往任何时候都需要调用 setAttributes()图细胞,3 个编辑方法是默认的 改变属性和设置属性地图的路线,直接将保留撤消 历史并没有刷新的细胞和相应的显示。 的 getAttributes()是比较常用的,你也看到了正在使用的,而不是创建

在第 2 章中的 HelloWorld 示例的单元格插入一个嵌套的地图。同样,这 方法直接访问和改变在细胞储存地图应该只 通常可被用于信元插入。然而,有一个例外,当 你想改变一个或多个单元格的属性,而不添加到撤消的变化 你的历史和性能要求高的操作。一个常见的例子,这是一个 鼠标滚动。调用编辑()是过量的,例如,以突出显示单元格时 鼠标移动到它。在这种情况下,你应该得到的单元格的属性,进行更改 存储的地方,地图刷新的细胞和重绘适当的区域。这个操作是 通常情况下,最好的细胞,在本章的后面部分对细胞 意见。请注意,由于 JGraph 的 5.11,双缓冲接口需要明确地告诉 关于中发生了变化。界限的变化应被发送到 JGraph.addOffscreenDirty()方法,像这样: graph.getGraphLayoutCache() 。刷新(viewsArray,FALSE); Rectangle2D 的 cellBounds GraphLayoutCache.getBounds(viewsArray); graph.addOffscreenDirty(cellBounds); graph.repaint(); 3.2.2 EDGE 和端口接口 边缘接口中定义的方法需要设置,并确定连接 一个特别的优势。这些的 getSource()中,getTarget() ,setSource()和 setTarget() 。它们的职能是相当明显的,从名字,记住所有 第 43 页 插图 18:GraphCell 的接口层次结构 JGraph 的用户手册 边有一个方向,在模型中,从源端向目标端。同样, 在这些方法中所涉及的所有类型对象提供完全的灵活性。在 结合与而 GraphModel 接口,它有可能获得的细胞(s)连接 的边缘,确定它们的类型和导航始终没有实施, 具体细节。 Port 接口定义了必要的方法来添加,删除和取得的边缘 连接到它。请记住,端口的概念是一个实体与一个顶点 可以连接任意数量的边缘。边可以连接他们的源或目标 结束一个端口,该端口的源或目标端口,分别。的边缘也可 其源端和目标端连接到同一个端口,使边缘的自我循环。注意 自循环时所创建的边缘具有相同的顶点作为它的源和目标,不只是 如果源和目标端口是相同的。自循环测试时,你应确保 你得到源和目标顶点,一般是父母的源和目标端口, 看看他们是相同的顶点。 边缘接口也定义了静态路由接口。这个接口定义了 路由方法处理绘制边缘的一些点,通过它, 边缘通过。这将扩展在本章后面的部分使用边。 端口定义的方法的边缘() ,addEdge()和 removeEdge() add 和 。 删除方法接受一个 Object JGraph 的设计标准。边()返回 集合的迭代器连接到该端口的边,成立了由 添加和删除方法。

请注意,端口不存储任何信息,关于是否是源或 目标端口连接到它的边缘。此信息仅在边缘,以避免 冗余和满分同步的信息的危险。 两个较小的已知的方法在港口 getAnchor()和 setAnchor() “ 。 锚定的想法还需要一个端口是如何定位的解释,是他们相对 或绝对的产地在哪里,或者如果他们没有偏移的偏移量。这是 在本章中使用的端口在后面的章节描述。 3.2.3 DEFAULTGRAPHCELL DefaultGraphCell 图细胞中提供的是标准的实现 JGraph 的,与大多数的默认实现是合适的作为,或作为 超类的细胞大多数的应用程序。像相应的接口, 的顶点使用 DefaultGraphCell 类和边缘端口使用默认的类 子类的从 DefaultGraphCell: 第 44 页 JGraph 的用户手册 这里从设计扩展 JGraph 的 JTree 的是再明显 DefaultMutableTreeNode 的超类的默认图形细胞 实现。有两个重要的原则是继承树的节点,即 细胞可能与另一个用户对象的父/子关系。 “ TreeNodes 的接口提供了基本的方法来确定一个细胞的家长和学生。 在可能的情况下,你应该使用的图模型方法遍历父/子 优先的关系,因为提供 DefaultGraphCell 而 GraphModel 是接口和设计合同。 3.2.3.1 默认图表细胞构造函数和方法 这导致我们,每次服用一到四个构造函数的 DefaultGraphCell 附加参数。如果你看看源代码的类,你会看到每个 缺少的参数,直到他们最终全都会调用此构造函数传递一个空值 构造函数: 公共 DefaultGraphCell(对象 userObject,AttributeMap storageMap, MutableTreeNode []儿童) 前两个参数,你应该相当熟悉。该 userObject 参数成为用户对象的细胞,效果显着。 storageMap 参数,如果 非空,则该单元格所使用的 AttributeMap,一般其生存期。 此参数最常用的是当你的应用程序需要一个自定义属性图 存储。请注意,细胞克隆不使用的这种机制转移属性 地图。最后一个参数,儿童,是一个数组的单元格,你希望让孩子 在当前单元格在树节点的关系。在 HelloWorld 例子中,我们可以有 第 45 页 图 19:默认的图形细胞的类层次结构 JGraph 的用户手册 创建 DefaultPort 并将其插入使用这个参数,而不是将它添加 稍后明确使用 add()方法的 DefaultMutableTreeNode。 在 DefaultGraphCell 其他的方法只是简单的实现在 而 GraphModel,以外额外的 clone()方法。 setAttributes()确保

属性地图如果传入的是 null,只有 3 参数版本 构造函数调用 setAttributes()内 JGraph 的。如果你有自己的属性图 子类,如果可能的话,你应该创建子类的每一个默认的单元格类型 新的实例,如果您忘记了您的自定义属性地图内 setAttributes() 创建一个实例每次在 DefaultGraphModel 构造。 clone()方法返回一个深拷贝,使用超一流的克隆方法和 克隆方法的属性图。 的 DefaultPort 实现很简单,主要包括 getter 和 setter 方法 和其他克隆方法。值得注意的是,被实现为一个边的集合 HashSet 的,这意味着,在该迭代器的边缘(返回)的顺序 提出了边缘不放心。当 Java 1.3 成为生活的结束,2006 年 12 月 要改变一个 LinkedHashSet 的保留订购。您可能希望 改变自己,直到然后,如果你使用的是 Java 1.4 或更高版本,需要使用此功能。 DefaultEdge 实施,再次,通常是很明显的。在的 clone() 方法,但是,它可能不那么清楚,为什么不会被复制源和目标对象。 这是因为边缘可被克隆到不同的模型,其中的原始端口不 存在。 DefaultEdge 还包含默认的路由算法,DefaultRouting, 改变点的列表,传递到的路由()方法来路由的边缘在一个更 美观的方式。 3.2.4 克隆细胞 的 DefaultGraphCell 的 clone()方法调用父类克隆,并增加了 该单元格的属性映射到新的细胞克隆版本。应当注意的是,这 复制机制不会增加儿童的原始细胞克隆,或什至引用 的原创儿童的克隆。也没有这个机制克隆的用户对象(见第 在短期内用户对象) ,它只是将原来的用户对象的引用。要获得 “深”的一个细胞,用克隆的儿童和克隆的用户对象的克隆版本,有一个 上 DefaultGraphModel 静态工具方法来执行此操作: 对象克隆= DefaultGraphModel.cloneCell(graph.getModel() ,顶点); 3.3 用户对象 userObject 的 DefaultMutableTreeNodes,所以也 DefaultGraphCell,是一个对象,它可以发挥重要作用的方式,你 构建更复杂的基于 JGraph 的应用程序。用户对象存储的任何数据 与不属于的一部分的图形单元或它的属性的图形单元。 这方面的一个例子,是设计工作流程编辑器导出到一个特定的工作流格式。 编辑器将细胞代表一个开始,一个分支,参加活动,等等。 “ 第 46 页 JGraph 的用户手册 将用于存储 userObject 特定于该类型的细胞的信息,所以这 信息可以被送入出口阶段。对于一个活性细胞,这可能包括一个 分配的人的活动的名称的字符串和一个 URL 含有信息 关于它。该应用程序将提供一些手段来修改的 userObject,所以 userObject 由专业化的曲线图电池需要被访问,通常的 DefaultGraphCell,因此,它知道真正的对象类型的 userObject。 必须在 userObject 实施的唯一的方法,该方法可用在 JGraph 的

toString()方法。默认情况下,返回的字符串是显示为 该单元格的标签。在没有数据存储要求的简单的应用程序与 userObject,使用 String 作为 userObject 本身,如图所示在 HelloWorld 例如: 细胞[0] =,新 DefaultGraphCell(新的 String(“你好”) ); 参数的 DefaultGraphCell 实际上是的细胞 userObject。自 作为一个 String toString 方法返回此字符串符合最低 用户对象的要求。 请注意,要显示在单元格的标签的值有一个间接通过 JGraph.convertValueToString(对象) 。此方法允许单元格标签 在不同情况下的 JGraphs 显示的替代文字相同的细胞。 3.3.1 获取和更改用户对象 仅存储作为与单元格相关联的对象的小区的用户对象,它不存储 在细胞的存储属性图。然而,为了提供给用户的变化的一致性 通过编辑调用的对象可以获取用户对象,使用: GraphModel.getValue(对象) 并设置用户访问对象使用 GraphConstants.setValue(对象) 属性映射将确保在最终的存储映射的用户对象并没有结束, 但是,以这种方式设置对象和调用编辑()将确保给用户的变化 正确添加对象的撤消历史记录。 3.4 细胞次数 JGraph 的 MVC 模式适用于图形细胞内,以及整体的设计 本身。所有图形细胞具有至少一个相关联的细胞视图,处理各种视觉 功能和更新的可视化的过程中,该单元格。细胞视图关联 渲染器,编辑器和电池手柄。 设计背景 - 读者熟悉的与表格和 JTrees 的可能想知道 为什么有一个单元格视图,你可能认为只是一个单元格对象和渲染, 对象。一个图形组件有相当多的视觉复杂性和几何图案 第 47 页 JGraph 的用户手册 比现行标准 Swing 组件的灵活性。在设计水平的 GraphModel 和 GraphCells 基本上实现图形结构,没有任何 隐含的假设任何可视化能力。将所有的功能性 细胞的视图的图形细胞会不必要地膨胀的纯图形模式方面的 JGraph 的那些只希望完成的图表分析。在 JTree 的设计, AbstractLayoutCache 持有布尔值,指示是否每个节点的扩展 或没有。走势细胞比一个布尔值,有相当多的视觉状态,必须有一个 ,而不是 GraphLayoutCache 保持每个单元的集合类的抽象状态 状态,也就是说,每 10 个元素的功能,这个类是细胞视图。另外在 JTree 的是不相关联的不同的细胞与细胞渲染器的选项。以 jtree 例如直接引用的单元格渲染器,因为 JGraph 的的 renderering 灵活性 将要求 GraphCell 引用渲染器未经细胞视图。这打破了 处理图结构设计的 GraphCell 规则。最后,无细胞

视图,它是不可能有本地视图的属性,即,在不同的视图中的细胞是 显示方式不同。 渲染器的 Swing 设计的一部分,它们抽象的绘图功能的 成一个单一的静态类实例的组件,也称为飞摆的设计的图案。 我们的想法是为所有组件的意见,可以得出同样的事情,只是用不同的视觉 属性,这一共同的实例。这就避免了过多的内存要求。 大量相同的组件。当单元格被渲染的曲线图的属性 细胞视图中取出并插入到渲染器实例,这个过程被称为配置 渲染器。细胞所画的渲染,这个过程持续了每一个细胞。 这种方法可以节省大量的存储空间,每个细胞对最坏情况下的一个实例 机制。然而,安装属性的过程中,产生一个小的性能损失,但 绘画的计算要求相比,这通常是可以忽略不计的 组件。渲染器在本章的后面更详细的描述。 与一个单元格视图编辑器是相同的原则,为 JTable 中的单元格编辑器 JTree 的元素。如果您双击一个顶点或边的 HelloWorld 示例 它带来了什么叫做就地编辑器,这是一个组成部分,在这里你可以编辑文本 与正在编辑的单元格的位置被定位在一个单元格相关联。默认的 编辑器是一个简单的,单一的编辑器称为 DefaultGraphCellEditor,该 扩展 CellEditor。它可以实现多线,丰富的文本,甚至是一个字 处理器的样式编辑器,如果需要的话。 3.4.1 电池手柄 电池手柄在 Swing 中没有一个平行的概念,在其他 Swing 组件细胞 只通过就地编辑进行编辑。 JGraph 的引入的概念 改变边界尺寸的细胞,以及细胞移动到任意位置。细胞 手柄执行显示的可视化表示的任务,这表明细胞能提供 调整大小和移动,以及在单元格上的任务处理交互式操纵或 组单元格。意味着他们所拥有的属性,让您的名字手柄 处理的细胞,使用鼠标或其他输入设备。把手周围出现的细胞, 当前选择的,表示细胞可能已经移动和大小调整操作施加。 第 48 页 JGraph 的用户手册 句柄是一种常见的范例在许多图形应用程序,例如在一个字 处理器如果您选择的图象处理上会出现的图像的周长 表明,它可以提供移动和调整。 把手是在 JGraph 的复合模式的基础上。根对象提供了访问 儿童基于一个共同的接口,CellHandle 接口。 UI 委托创建 一手柄,通常称为 RootHandle,和根手柄,反过来,使用 CellView 的 getHandle 方法来创建其子处理。 CellHandle 接口定义了一个句柄必须提供的基本功能,请注意 ,该 CellHandle 界面非常相似的 MouseMotionListener MouseListener 的。可视化是油漆(图形克)和 覆盖(图形克) 。为每个选定的单元格的绘制方法绘制处理 当细胞是静态的,覆盖方法与绘制过程中实时预览, 通常作为快速异或画的速度,而细胞动态

感动。我们会回来的一章中的事件处理。 手柄的默认实现 JGraph 的 SizeHandle, EdgeHandle 和的 RootHandle。根句柄是负责移动细胞, 用于调整大小手柄细胞和边缘手柄允许的连接和 断开的边缘,以及互动式此外,修改和删除 独立点/边缘。 第 49 页 图 20:静态手柄周围的 选定的单元格和边缘绘制由油漆 方法细胞手柄 图 21:绘制一个动态的手柄 覆盖当一个细胞大小 JGraph 的用户手册 3.4.2 细胞视图层次结构 CellView 接口定义了一些方法与屏幕上的 更新,访问和修改的视觉属性和访问相关联的视觉 组件。 getRendererComponent() ,getHandle() ,getEditor() 方法返回的渲染器,手柄和与细胞视图相关联的编辑器,作为 在本节前面所述。 refresh()方法被调用时,细胞的细胞模型的观点是 相关的变化。进行必要的更新的视图属性, 但不会导致重新绘制的单元格的意见。注意的是,3 个编辑方法自动 调用刷新和重绘的变化受各方面的意见。前面提到过,如果 你想一个高性能的变化影响到一个单元格,而不需要撤消历史记录 的变化,你应该改变细胞的属性,调用 refresh,然后重新绘制。 “ 刷新的时候调用相应的细胞发生了变化,而不是依赖 细胞的细胞的变化的曲线 update()方法是刷新的方法,使用同步自己的 属性与相关联的图表的单元格的。这种方法被调用时,相关的 细胞模型的变化,但也依赖细胞的变化,或只是一个视图更新时, 需要,这期间发生的实时预览。 更新是一个好方法实现自动属性的修改,如 作为边缘路由功能或其他功能,是基于细胞的其他属性,或图形 几何。 细胞的视图层次结构是分开存储的父/子关系图模型 第 50 页 插图 22:CellView 的接口,默认的实现和静态关系 JGraph 的用户手册 结构。虽然这看起来可能有些混乱,它提供了一个极大的灵活性, 使用此功能的大部分被隐藏从显影剂。如果没有这些信息 你需要从细胞鉴于其细胞模型,得到其母公司和导航 备份根据母细胞视图。从模型看到的是一个依赖高度 不可取的。使用这种结构的一个例子是边缘连接到细胞的方式 在倒塌的视觉连接到外围的第一个可见父母的细胞。

这是完全在视图中执行,而无需参考模型。该方法 用于访问的小区图关系 getParentView getChildViews()() , , removeFromParent()和 isLeaf() ,所有从他们的执行功能明显 命名。 3.4.2.1 getPerimeterPoint getPerimeterPoint()在 CellView 你是在任何危险的是第一种方法 实际实现的一个简单的应用程序。 getPerimeterPoint 返回 指向的周边上的视图,其中的参数列表中指定的边缘相交。 得到正确的,这是非常重要的,因为端口的基本类型,浮动端口,使用此方法 确定边界上的一个顶点的边缘应终止。使用端口 浮动的端口更详细的描述,对本章结尾。 AbstractCellView,将返回默认的单元格视图的抽象父类的所有中心 点的单元格,如果你不提供一个实现的 getPerimeterPoint 进一步下跌的类层次结构。 3.4.2.2 getRenderer 另一种方法,你可能担心自己的,如果你创建一个单元格类型 是 getRenderer() getRenderer 实际上是不在 CellView 接口的,唯一的 。 getRendererComponent。实施 getRendererComponent AbstractCellView,你会直接或间接的子类的类 99.9%的自定义单元格的意见,看起来像这样: 公共的组件 getRendererComponent(JGraph 的图,布尔选定的, 布尔重点,布尔预览) getRenderer 和 CellViewRenderer CVR =(); (CVR = NULL) 返回 cvr.getRendererComponent(图,为此,选择,重点, 预览); 返回 null; } 正如前面所提到的,不同的细胞类型的细胞,细胞视图和细胞由 渲染器。如果你创建一个新的细胞类型是视觉上不同的你已经拥有的, 例如,你想添加一个圆圈细胞,你需要创建一个渲染器类描绘了一个圈 并确保视图渲染该单元格回报。 3.4.2.2.1 如何创建自己的单元查看和渲染 下面是一个模板,你可能会开始创建你自己的看法时: 第 51 页 JGraph 的用户手册 公共类 MyView 的:扩展 AbstractCellView { 受保护的静态 MyRenderer 渲染新 MyRenderer(); 公共 MyView 的(){ 超级(); } 公共 MyView 的(对象为 arg0){ 超级(为 arg0); }

的公共 CellViewRenderer getRenderer(){ 返回渲染器; } 公众的 Point2D getPerimeterPoint(EdgeView 边缘,Point2D 的来源, Point2D 的 P) 如果(getRenderer()的 instanceof MyRenderer) 回报( (MyRenderer) getRenderer()。getPerimeterPoint(这 ) 源,P); 返回 super.getPerimeterPoint(边缘,来源,P); } 公共静态类 MyRenderer 的扩展 JLabel 实现 CellViewRenderer,可序列化{ 公共无效漆(图形克){ } 的公共组件 getRendererComponent(JGraph 的图形,CellView 看来,布尔 SEL,布尔重点,布尔预览){ } :公众的 Point2D getPerimeterPoint(VertexView 来看,Point2D 的 源的 Point2D P) } } } 请记住,它应坚持轻量级的模式,并拥有一个单独的静态渲染 实例为每种类型的细胞视图减少内存占用。 3.4.3 创建 CELL 的意见和关联起来 细胞 创建视图的每一个曲线图创建的单元格的单元格的方法,将是有点 繁琐的手动执行的,所以它是在幕后使用的单元格视图工厂。 该接口 CellViewFactory 定义 CreateView 的一种方法中, 。这需要一个 () 第 52 页 JGraph 的用户手册 实例的曲线模型和要创建的图形单元,该视图是,创建 相应的单元格的观点及联营公司的细胞和看法。细胞的视图工厂 相关的 GraphLayoutCache 和一些构造函数 作为一个参数,GraphLayoutCache 采取的 CellViewFactory 的。你可以改变的, 在整个使用寿命中的高速缓存使用 setFactory 和访问的小区图工厂 getFactory。 的默认实现 CellViewFactory 是 如果你 DefaultCellViewFactory,不指定一个 CellViewFactory,当 创建一个 GraphLayoutCache,你会得到对你的出厂默认实例。 DefaultCellViewFactory,删除已过时的方法,看起来像这样: 公共 CellView CreateView 的(而 GraphModel 模型,对象细胞){ CellView 视图= NULL;

(model.isPort(手机) ) 视图:= createPortView(细胞); 否则,如果(model.isEdge(手机) ) 视图:= createEdgeView(细胞); 其他 视图:= createVertexView(细胞); 返回查看; } 受保护的 VertexView createVertexView(对象格){ 返回新 VertexView 的(细胞); } 受保护的 EdgeView createEdgeView(对象格){ 返回新 EdgeView 的(细胞); } 受保护的 PortView createPortView(对象格){ 返回新 PortView 的(细胞); } 联想到新的细胞和细胞意见的 DefaultCellViewFactory 扩展 类中,添加检查你的细胞类型,并返回一个新的实例关联的单元格视图 适当。例如,如果你添加 MyVertex 和 MyVertexView 的: 受保护的 VertexView createVertexView(对象格){ 如果(细胞 MyVertex){ 返回新 MyVertexView 的(细胞); } 返回新 VertexView 的(细胞); } 或者,如果你只是想圆视图中,您已经创建了默认的顶点使用, 没有创建自己的细胞类型: 受保护的 VertexView createVertexView(对象格){ 返回新 MyCircleView 的(细胞); 第 53 页 JGraph 的用户手册 } 记住,像所有的工厂,细胞视图必须返回一个新的实例。您的 应用程序将无法正常工作,如果他们不。 3.4.4 默认的单元格视图和渲染的实现 3.4.4.1 细胞次数 默认的单元格视图实现的 3 种基本类型的细胞 VertexView, EdgeView PortView。 VertexView 可能是最简单的实施 三,其他比 SizeHandle(见第 5 章活动) 。它的更新方法 确保顶点的观点有边界和 getRenderer,并 getPerimeterPoint 只是推迟到顶点渲染器。 PortView 有一个大小硬编码到最终变量 SIZE 和在返回 getBounds()方法。端口往往在视觉上相当简单和默认的

实现无柄,这意味着不调整。如果您想可变大小的端口 你可能的子类 PortView 和实施的 getBounds 返回的边界属性 端口的属性映射。 ,PortView 也有一些额外的功能有关端口的位置。 getLocation()和 shouldInvokePortMagic()提供的功能,使 它可以以交互方式移动端口以及局部优化调整 一个端口中的顶点位置上,以端正的边缘或连接到它的边缘。 EdgeView 是迄今为止最复杂的默认视图,因为它需要实现 大部分它的功能的从头开始,相对于得到的特定的继承的顶点 在其渲染的 JLabel 的功能。只是还没有在不必要的细节,有 一些通用的设计原则,值得一提的边缘视图。 边有一个标签,例如顶点,但也有额外的标签的概念。主标签 与往常一样在就地编辑和没有额外的标签的行为像一个顶点的标签 就地编辑。添加额外的标签,最主要的原因是支持多重 在 UML 图中。它们是分开的,以简化从主标签使用那些仅 第 54 页 图 23:一个标准的浮动端口边缘(左)和边缘连接到端口使用 “端口魔法”(右) JGraph 的用户手册 需要一个标签,因为他们没有以同样的方式为就地编辑的行为。 的实际路径的边缘需要被保持在一个 GeneralPath 对象,一个 Graphics2D 实用程序 对象,由序列的形状本身的 java.awt.Shapes 和继承。 的开始和结束的边缘上,这通常包括某种类型的箭头,附图 也 Shape 对象。的位置,通过该边缘通行证被称为点和一个 默认情况下边缘有两个,开始点和结束点。 A 点,其实是一个真正的点 或港口对象。任何额外的点,这两个点被称为控制点和线 作为一个序列的单独的线的形状的边缘的形状绘制每个顺序之间 双点列表中的点。请注意,因为这个原因,存储列表中的集合,该集合 点必须是有序的。 由于意见在顶部的 EdgeView 建议,也有一些类类型的假设 关于渲染的方法。如果你的的子类 EdgeView 和提供 自己的渲染器,你必须重新实现这些方法引用自己的渲染器 类型代替。 3.4.4.2 细胞渲染器 3.4.4.2.1 PortRenderer 在的 PortRenderer 是一种简单的 JComponent。看看在 getRendererComponent 的方法,这里就是你需要安装的属性 当前单元格视图画。请记住,有只有一个 PortRenderer 实例 所有 PortViews,所以当我们绘制每一个我们必须设置渲染器 当前端口的视图。这一原则延伸到所有的图形的单元格渲染器使用的轻量级的 端口渲染模式,仅仅是一个简单的例子。这就是为什么细胞视图和 三种细胞状态,选择,预览和焦点被传递到 getRendererComponent()和存储在渲染器的自己的变量。在涂料 方法渲染器使用这些存储的变量,绘制细胞以适当的方式。

选定的指示或小区是否被选中,预览是与否的细胞是 第 55 页 图 24:边缘,其主要标签和 两个额外的标签。边缘有两个控制点 和线条样式设置到 GraphConstants。 STYLE_SPLINE。由于边沿选择 由边缘的边缘上的点表示 处理 JGraph 的用户手册 正在制定中实时预览(异或预览的同时拖动图 之前松开鼠标) ,重点是是否细胞是目前的重点 (这可以是一个不同的状态来选择) 。 3.4.4.2.2 VertexRenderer 的 JLabel 的 VertexRenderer 继承自。这提供了很多的功能 免费的,虽然看似简单的任务,可以限制一个 JLabel 使用。同样, getRendererComponent()设置渲染器的特定视图和细胞视图 状态。除了这些状态的本地存储,VertexRenderer 添加的内部的方法 称为 installAttributes() 。执行任务获得的属性地图 顶点和存储所有的可视化属性的期间考虑到在油漆 类中的本地方法。请注意,大多数属性属于 JLabel 的而非 VertexRenderer,这给使用的 JLabel 的一些想法的实用性 父类。 大部分的绘画功能是在父类中,除了画中的 选择边框的渐变色填充。正如你所想的,所选择的标志传递 到 getRendererComponent 使用的触发选择边框的画。 getPerimeterPoint() ,传入边缘的实际计算 满足的顶点的边界进行。请注意,对于一个矩形的顶点的 计算是不平凡的,最简单的的 getPerimeterPoint 实现实际上是为 一个圆形的顶点。 3.4.4.2.3 EdgeRenderer EdgeRenderer 遵循相同的模式,它的状态和其安装的看法 属性,但它需要的更多的代码,因为它继承了从 JComponent 必须执行其自己的标签画。额外的功能也提出了另一个问题, 同步渲染器和电池当一个人的公共方法被称为 未经使用 getRendererComponent。例如,如果你调用 getLabelPosition(EdgeView 视图)确定的主要标签的位置, 必要的属性,以确定标签的位置必须安装。有一种方法 setView()来执行这个功能,你会看到它的顶部附近的许多 公共 get 方法来设置单元格的属性查看和安装。这可能意味着, 在同一个边缘的重复工作,可以有多余的属性安装 导致的性能损失,但通常很小在总百分比计算, 。 如果,延长 EdgeRenderer 或试图实现自己的版本,牢记 的要求,以确保属性安装总是发生。如果您发现边缘 画在错误的地方,或与另一条边的标签,你可能已经错过

一个呼叫 setView 或等效的方法在自己的类。 独特的的 EdgeRenderer 类是 createShape 和 createLineEnd 方法。有三个 Shape 在 EdgeView 对象被创建为必要的 createShape,这些都是 beginShape 的,endShape 和线型。线型是 形状“的顺序对在边缘点之间的序列,每一个画 第 56 页 JGraph 的用户手册 根据上线的风格,短划线图案的运用等。 beginShape 和 endShape 装饰,通常箭头,可放置的任一端 线型和他们的创作涉及在 createLineEnd。如果您正在寻找 创建新的线条样式或结束装饰品,这些都是你需要适应的方法。 在涂装前安装电池在渲染视图属性的机制,有 的问题时,此功能可以从一个以上的线程调用。如果你这样做 需要另一个线程执行一个线程,绘画,图形结构 应该把发射/捕获机制的情况下,连接这些地区的所有属性 安装和绘画只发生在一个线程。 3.5 使用电池 3.5.1 使用顶点 在本节中,我们将着眼于各种内置的功能,可用于显示 顶点。正如所提到的,默认的顶点渲染器从 JLabel 的继承。 JLabel 的可 显示文本和/或图标。 3.5.1.1 界 所有细胞的基本概念之一是它的界限。一个单元格的边界是最小 矩形完全包围该单元格。 JGraph 的采用双统筹整个 所以任何单元格的边界是 Rectangle2D.Double 的类型。的所有单元格的边界是 在他们的存储属性映射通过 GraphConstants.BOUNDS 关键。 由于顶点的位置和尺寸的,是特别有用的数据,VertexView 存储缓存的值的范围在成员变量命名为界限。这可能是 通过 getBounds()方法对该类访问。 前面提到的细胞意见,update()方法是一个很好的地方, 把代码进行更新,需要处理的功能,不仅在图形细胞 的变化,而且在实时预览的变化。它是 VertexView.update() 更新缓存的边界在 VertexView 值的,它也保证了值,界 非空: 边界= GraphConstants.getBounds(allAttributes); (边界== NULL){ 边界= allAttributes.createRect(defaultBounds); GraphConstants.setBounds(allAttributes,界限); } 您通常不需要执行任何其父部件的位置 setLocation 调用交互操作 的图形,JGraph 的照顾你。如果你想以编程方式定位或 调整节点,创建一个嵌套的细胞/交通地图对地图,第 2 章中所描述的,和 第 57 页 JGraph 的用户手册

通过新的边界值进入编辑()调用。 只要获得一个单元格的边界,你应该这样做,从细胞的观点。如果您 有细胞的视图对象,getBounds()中提供了一个方便的方法这样做。如果你这样做 不,有一个实用的方法,JGraph 类称为 getCellBounds(对象 细胞) ,将返回的界限值的细胞的细胞通过传递 参数。另一种有用的工具,在 JGraph 类是 getCellBounds(Object []的 细胞) 。这需要一个单元阵列,并返回相应的小区的总范围 的意见,即所有单元格的最小边界矩形。 3.5.1.2 约束顶点界 有些时候,你希望强制一个顶点的尺寸等于 水平方向和垂直方向。明显的例子是一个顶点的形状时,必须有一个 方形,而不是仅仅一个矩形,而不是一般的椭圆或圆。 GraphConstants.setConstrained(地图,真实); 会导致 JGraph 的执行情况,地图是交通地图 编辑呼叫期间或单元格的存储的地图的细胞之前,该信元被插入。 3.5.1.3 调整和自动调整大小 当你插入一个单元格时,你可能会想,以确保标签在单元格中(无论 userObject 细胞的回报,它的 toString 调用)是完全可见的。获取字体 指标,计算给定的字体和字符串值的宽度将是乏味等 调用: GraphConstants.setResize(地图,真实); 将导致细胞在插入时被调整,使标签是完全可见的。这是一个 然而,一次性的效果。 JGraph 的将删除 GraphConstants.RESIZE 的的金钥 一次细胞存储的地图的动作被执行。如果您希望有更多调整为 发生时,设置该属性为 true,再调用 Edit() 。请注意,改变单元格的存储 属性映射在调用 refresh,并重绘将无法正常工作,调整大小取决于 图形模式或图形布局缓存更改事件被解雇,这需要编辑调用。 当然,设置单元格的调整对每一个编辑是不实际的,如果你想要的单元格 总是被设置为它的首选大小。相反,你应该请使用关键的 AUTOSIZE: GraphConstants.setAutoSize(地图,真实); 这将设置单元格的首选大小模型和布局缓存后的变化。一 差异,你会发现与细胞自动调整启用的是,他们没有 处理时选择。毕竟,它允许用户调整单元格的大小是相当没有意义的,如果 应用程序会被立即恢复的变化。 第 58 页 JGraph 的用户手册 一个单元格的大小来确定的基本机制在调整大小或自动调整大小事件 实际上是在单元格渲染器的 getPreferredSize() 。默认情况下,顶点将返回 矩形略大的最小边界矩形的图标和文字的 JLabel 的,如果任一存在。 3.5.1.4 图标 JLabel 的是能够显示文本和图标,图标设置: GraphConstants.setIcon(地图,图标) 如果 AUTOSIZE 允许,将会指定的图标将显示在细胞内,

确保该单元格的边界是至少大到足以容纳该图标。 如果没有自动调整功能的单元格的边界可能夹图标或稍大 比需要的图标。如果你想,你也许会想适应的 paint 方法的渲染 缩放图标,这样可进行内的一个子类 VertexRenderer 如下: 公共静态类 ScaledVertexRenderer 的扩展 VertexRenderer 公共无效漆(图形克){ ICON 图标 getIcon(); 操作 SetIcon(NULL); 维数 d = getSize(); 图片 IMG = NULL; (图标的 instanceof 的 ImageIcon) IMG =( (的 ImageIcon)图标) 。的 getImage(); (IMG = NULL) g.drawImage(IMG 公司,0,0,d.width - 1,d.height - 1, 图); super.paint(G); } } 在 JLabel 的,可用的方法重复使您能够在 GraphConstants 沿 Y 轴的标签的内容对准: GraphConstants.setVerticalAlignment(地图,INT); 其中 int 参数可能是以下中定义的常量 SwingConstants:TOP,CENTER(默认值) ,或底部。也用于对准的 标签的内容与 X-轴 第 59 页 图 25:右侧顶点自动调整大小,请注意 两个顶点的自动调整大小的选择,但没有 处理 JGraph 的用户手册 GraphConstants.setHorizontalAlignment(地图,INT); 其中 int 参数可能是以下中定义的常量 SwingConstants:LEFT,CENTER,RIGHT(默认情况下,图像标签) , 领导(默认情况下,文本标签) ,或者结尾的。 3.5.1.5 标签文本 JLabel 的文本成分也可以相对于该图标对齐。垂直 相对的对齐方式进行使用: GraphConstants.setVerticalTextPosition(地图,INT); 其中 int 参数可能是以下中定义的常量 SwingConstants:TOP,CENTER(默认值) ,或底部。水平相对 取向是通过使用: GraphConstants.setHorizontalTextPosition(地图,INT); 其中 int 参数也许有以下定义的常量 SwingConstants:左,中,右,领导,或后(默认值) 。

GraphConstants 还提供 setFont()方法,使您能够配置 设置的字体显示的文字和 GraphConstants.setForeground() 文本的颜色。如何使用字体的全部细节超出了本手册的范围, Java 图形的更多信息,任何很好的参考。 3.5.1.6 国界 边界是一个摆动功能,使您可以绘制美观的边界 周围的 Swing 组件的边缘。由于标准的顶点呈现为一个 JLabel 的,你可以设置边框的顶点,使用标准的边界: GraphConstants.setBorder(地图,边境); 边界类型的更多信息,可以发现在边境 API 包的摘要: http://java.sun.com/j2se/1.5.0/docs/ 的 API / javax / swing/border/package- 的 summary.html。 你在 http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/ BorderFactory.html 第 60 页 图 26:使用不同的水平和/或图标排列 垂直对齐设置 JGraph 的用户手册 找到有用的工厂方法,简化创建这些边界的过程中。例如: GraphConstants.setBorder(地图,BorderFactory.createRaisedBevelBorder() ); 创建一个凸起的边框的效果,你通常会看到一个按钮的类型。 GraphConstants.setBorder(图 BorderFactory.createLineBorder(graph.getBackground() ,6) ); 将创建一个空白顶点周围的边框,使用图形的背景颜色 画出来。这是非常有用的,你想有边缘终止短距离内从顶点 而不是直接在外线。颜色也可以改变使用 GraphConstants.setBorderColor() 。 3.5.1.7 颜色 GraphConstants.setBackground(图色) 设置填充颜色具有恒定颜色的顶点,而: GraphConstants.setGradientColor(图色) 设置渐变填充整个顶点,开始为白色,并逐步在整个变黑 顶点指定的颜色。 第 61 页 图 28:在左边的两个顶点填充使用通过 setColor,并在右边填充的使用 setGradient。所使用的颜色(红,绿,蓝)值表示 图 27:在左边线边框的 的曲线图的背景颜色。在右边的一 提出了斜面边框 JGraph 的用户手册 3.5.1.8 插图 GraphConstants.setInset()提供了一种手段,放置一个缓冲的周围区域 标签,这样的 getPreferredSize()返回一个尺寸足够大的标签加 插图。这个尺寸是由单触发调整大小和自动调整大小功能使用。

3.5.2 使用边 3.5.2.1 界 界的运作方式稍有不同的边缘。界边缘的值仍是 最小矩形包围的边缘,但其采用的是较为有限的 顶点。界限的边缘给没有迹象表明它开始或结束,或路径是什么呢 考虑这两个点之间。使用的边缘范围应限于确定 剪辑边界,如果你需要手动强制重画。 3.5.2.2 控制点和路由 正如前面提到的,DefaultEdge 持有有序的点的集合 描述的路径的边缘如下。在其最简单的边缘会被作为一个序列的绘制 这些点之间的直线。您可以设置这些点的有序列表: GraphConstants.setPoints(地图,清单) 然而,JGraph 的支持正交,贝塞尔样条曲线风格的图纸和线 样式属性的边缘: GraphConstants.setLineStyle(地图,INT) 地图的边缘通过的属性 GraphConstants.STYLE_ORTHOGONAL,GraphConstants.STYLE_BEZIER GraphConstants.STYLE_SPLINE 是适当的。请记住,这些样式要求 控制点,否则他们会简单地显示为直线。 控制点可以手动添加或使用路由的方法。我们简要地 前面提到的在本章 Edge 类里面定义的路由接口。一 路由算法通常是一个静态类的实例共享的所有边缘路由 这种方式。您可以设置路由的边缘使用: GraphConstants.setRouting(地图,GraphConstants.ROUTING_SIMPLE); 使用 DefaultEdge.DefaultRouting,提供基本的路由算法与 JGraph 的。 DefaultRouting 的各种线条样式,设置适当的控制点 节省你自己定义。 DefaultRouting 还设置了路由 自成回路,使他们目视离开顶点,并返回到它。 第 62 页 JGraph 的用户手册 路由接口本身定义了一个方法,路线() ,它采用边缘 被路由点的列表,作为参数被改变。实现平行 边缘路由器是可在 JGraphpad 社区版的,如果你需要不同的 JGraph 的团队自定义的实现是值得的检查,看看是否有人有 已经做到了。 如果你想限制的互动(使用鼠标) ,添加或删除控制 点,从一个边缘,setBendable 的(地图,虚假)将禁止这些行动 指定的边缘,即使应用程序支持这样的功能。 3.5.2.3 定位边标签 标签定位的配置较为灵活顶点 支持任意数量的标签。主标签,如显示顶点,无论 用户连接到边缘返回的对象的 toString()方法。标签的设置 位置进行使用: GraphConstants.setLabelPosition(地图,Point2D 的);

点参数定义标签位于跨越边缘的相对距离 X 坐标和距离的边缘正交标签位于 Y 坐标。 跨越边缘的相对距离的测量是从 0,在开始的边缘,以 GraphConstants.PERMILLE,在端部的边缘。因此,通过: Point2D 的点=新 Point2D.Double“(GraphConstants.PERMILLE / 2,0); 将导致在标签的开始点和结束点之间的中间位置为中心。 第 63 页 图 29:三个边缘路由使用指定的线条样式 DefaultRouting 算法 JGraph 的用户手册 Point2D 的点=新 Point2D.Double“(GraphConstants.PERMILLE / 2,100); 将导致在被定位的标签之间的中间位置上的 x 轴位置的开始 点和结束点的中点以下,100 像素的开始和结束点的 y 轴 位置。请注意,当我们写“下面的”我们都在谈论下方的平面边缘 使得的开始点时,是左侧的终点。 你也可以去 GraphConstants.PERMILLE 范围在 0 到的范围之外。 额外的边缘上的标签都存储为对象,无论他们在他们返回 toString()方法是显示的内容。这是不可能的,你将使用以外的任何其他 这些对象的字符串作为。定位系统是相同的,作为主标签。 “ 您使用的方法设置和定位这些额外的标签是: GraphConstants.setExtraLabels(地图,对象[]) GraphConstants.setExtraLabelPositions(地图,Point2D 的) 第 64 页 插图 30: “(GraphConstants.PERMILLE / 2,0) 插图 31: (GraphConstants.PERMILLE / 2, 100) 插图 32: (GraphConstants.PERMILLE 信息* 2,-50) JGraph 的用户手册 因此,使用此代码: Object []的标签=新的 String(“0”) ,新的 String(“1”)}; 的 Point2D [] labelPositions = {新 Point2D.Double (GraphConstants.PERMILLE * 7/8,-20) ,新 Point2D.Double “(GraphConstants.PERMILLE / 8,-20)}; GraphConstants.setExtraLabelPositions(edge.getAttributes() , labelPositions); GraphConstants.setExtraLabels(edge.getAttributes() ,标签等); 我们可以在任一端的边缘放置一个标签,并略微偏离的平面的 的边缘,以使标签的不重叠的边缘。再次,注意 Y 偏移量是相对于 平面的边缘,所以你仍然有标签出现在正确的旋转边缘 相对位置。 标签绘图方面是非常有用的的另一效果是迫使标签的能力 是与边缘平行: setLabelAlongEdge(地图,真实);

第 65 页 图 33:额外的标签上的优势,保持它们的相对旋转定位后,没有 星系的奇怪的状态,我的意见,请 JGraph 的用户手册 其他代价的边缘标签的文本颜色设置使用: GraphConstants.setForeground(地图,颜色) 3.5.2.4 边缘样式 存在一些配置选项更改外观的主线 部分的边缘(我们将讨论最终的装饰下) 。两个简单的选择是: GraphConstants.setLineWidth(图 5); / /套的边缘线宽度为 5 GraphConstants.setLineColor(地图,Color.blue); / /套的边缘线 颜色为蓝色 以前线的形状以外的另外两个边缘风格的配置方法( 提到的)是: setDashPattern(地图,FLOAT []) setDashOffset(地图,持股量) 这两个值对应的最后两个参数传递到 BasicStroke 的 构造函数: BasicStroke 的(浮点型,整型,整型,浮点型,浮法[],持股量) 但这些参数的 Javadocs 不到有帮助的。 虚线图案是一个坚实和清晰的边缘,重复整个长度的序列 的边缘。所以,创建一个数组{10,10},将意味着边绘制成固体 10 个单位的 10 个单位和重复此过程,以及边缘,然后明确。 {10,2,2,2}将意味着 固体为 10 个单位,明确 2,2 台固体和明确的另外 2,重复。很显然, 只有真正有意义的有偶数的条目,这个数组。这种模式是 贯彻应用,无论在边缘的点的形状或数量。静态 可变 GraphConstants.dash {5,5}的虚线样式中定义的情况下 第 66 页 图 34:标签平行其边缘 JGraph 的用户手册 你想节省内存使用这个单一的实例,而不是创建一个实例 每一个细胞的属性映射。 的破折号偏移量,也被称为虚线相位,决定多远到虚线模式 应开始绘制。默认情况下,仪表板偏移量为 0,将其设置为 5 {10,10} 虚线图案将导致边缘图 5 的实线单位,然后加入 10 单位的开始 线条清晰,然后再返回到 10 固体/ 10,明显的重复模式。将该值设置为 12 个 会导致该行开始的 8 个单位的线条清晰,然后再返回到 10 固体/ 10 清晰的重复模式。 破折号偏移的最常见的应用是动画的边缘。 JGraph 的 从来没有刻意承担任何多线程,所以它不能直接提供这样的动画。 然而,定时器在事件触发的方法的线程调度线程改变破折号 偏移和更新的边缘实现起来很简单。对于每一个更新,你需要得到一个 集合的边缘的细胞数以进行更新,就地改变破折号偏移值,然后 在调用 refresh 的边缘,终于重新绘制整个受影响的区域。这将需要一个

静态变量保持的电流值的偏移量,这将递减破折号 在每个定时器滴答。破折号抵消调用本身将需要使用的模量的电流 破折号偏移值,所以它重复虚线模式范围之间的界限。例如,假设 虚线图案{10,10},完整的范围内使用的模结果的破折号偏移 为 0?19 的需求: GraphConstants.setDashOffset(图 20 - Math.abs(dashOffset 20) ); 在这种情况下,应使用。请注意,破折号偏移需要,以递减 获得动画从一开始就结束的边缘,反之亦然。为了加快 动画,减少定时器的时间间隔,或递减破折号偏移值,由一个以上的 在每个节拍。 3.5.2.5 边端上的装饰品 在两端的边缘,你可以配置最终的装饰画,这通常 由箭头。 JGraph 的提供了一些常用的结束装饰品 可以启动,使用: GraphConstants.setLineBegin(地图,INT) GraphConstants.setLineEnd(地图,INT) 第 67 页 图 35:短跑图案边缘的显示方式 图 36:使用指定的偏移值 A {10,10}的虚线模式 JGraph 的用户手册 其中 int 参数是在 GraphConstants 可用的选项之一。对 删除装饰用上面的方法为适当的边缘,并通过在 GraphConstants.ARROW_NONE。您也可以完全删除属性的 属性映射讨论的那样,GraphConstants.setRemoveAttribute() 第 2 章。 这些风格可能会填满或不使用: GraphConstants.setBeginFill(地图,布尔) GraphConstants.setEndFill(地图,布尔) 如果你想改变大小的装饰,这是通过使用: GraphConstants.setBeginSize(地图,INT) GraphConstants.setEndSize(地图,INT) 3.5.2.6 连接限制 这是可能的话,每一个边缘的基础上,设定是否可以被连接的边缘或 断开交互使用鼠标。该方法是不言自明的: setConnectable(地图,布尔) setDisconnectable(地图,布尔) 第 68 页 图 37:可用的线路末端的装饰,填充设置为 true 在左手侧 JGraph 的用户手册 3.5.3 对于这两个顶点和边的属性 3.5.3.1 约束基本的编辑功能 接下来的三个属性需要解释一下。 与否 GraphConstants.setSizeable()控制细胞的大小可以调整使用

鼠标。如果设置为 false,用户没有提出任何手柄来调整。 可移动 GraphConstants.setMoveable 与否确定细胞 (重新定位,而不是调整)交互。 GraphConstants.setEditable(假) 禁止在就地编辑标签。你可以将此值设置为 false,如果你要双击 一个单元格以执行不同的功能,标记编辑。但是,您可能也 想改变需要鼠标点击就可以开始编辑使用的数量 JGraph.setEditClickCount() 。 无论细胞的每一个轴的基础上,可以移动,可以被配置为使用 GraphConstants.setMoveableAxis(地图,INT) 其中 int 参数是 GraphConstants.X_AXIS 的或 GraphConstants.Y_AXIS。显然,禁止移动完全使用 setMoveable 的。 设置可移动的轴,即 X_AXIS 导致顶点仅可移动 水平和 Y_AXIS 使顶点仅是可垂直移动。 3.5.3.2 不透明性 GraphConstants.setOpaque(地图,布尔) 将通过布尔值 JComponent.setOpaque()方法 渲染的细胞。由于该方法的 Javadoc 说:“如果为 true,组件绘制每 在其边界内的像素。否则,该元件可能并不描绘其部分或全部像素, 相关像素的显示出来。“在恒定的顶点的情况下 背景填充和渐变填充颜色,如果不涂不透明设置为 false。文本, 不管这个属性的设置图标,图像和边界的画。在的情况下 的边缘,边缘的默认实现不影响该属性,但你 应该考虑到这一点,因为你是自己的,更复杂,实施 的边缘。 第 69 页 JGraph 的用户手册 上图显示了一组单元格,先用不透明设置为 true,然后为 false。 它还显示了两组相互重叠的不同程度的细胞。不透明的 版本完全掩盖他们在前面,而在非不透明的情况下, 细胞重叠,只是边框,图标和标签模糊的细胞涂下方 它们。 3.5.3.3 选择 GraphConstants.setSelectable(地图,布尔) 判定是否可以选择细胞。将此值设置为 false,基本上 导致细胞停止任何互动功能反应。细胞可能不能调整大小, 第 70 页 图 38:细胞(从顶部)上的第一和第三组的细胞是不透明的,所述第二 和底部的细胞具有不透明设置为 false JGraph 的用户手册 移动(除非它是一个连接的边缘,随着与连接的顶点是 移动) ,或已进行就地编辑。 3.5.4 使用端口 3.5.4.1 港定位 当一个端口连接一个顶点作为一个孩子,默认情况下它是什么知道作为一个浮动

端口。这意味着它有没有固定的位置,任何连接顶点的边缘将看到 终止的边界处的顶点。请注意,该边缘被不只是隐藏由顶点, 浮动端口终止的边缘正好在边界的周长,否则被称为 可见,正确地放置点,细胞等箭头。此默认 实施适用于大多数的应用程序,因为它解决的相关问题 边缘穿越顶点到顶点边界上的一个固定点。请注意,这依赖 对正在实施的顶点渲染 getPerimeterPoint()方法 正确。 第二种类型的端口定位涉及的偏移量。调用: GraphConstants.setOffset(地图,Point2D 的) 端口上的细胞,修复细胞的端口相对位置。的值(0,0)对应于 左上角的细胞和(GraphConstants.PERMILLE, GraphConstants.PERMILLE)对应的单元格的底部右上角。 由于价值的细胞的比例尺寸,端口是否始终放置在 相同的相对位置的顶点的大小无关。 第 71 页 图 39:两个顶点连接使用浮动端口的边缘。注意边缘 上正确的边缘方向的任一顶点不管终止 JGraph 的用户手册 第 72 页 插图 40:HelloWorld 示例的与抵消端口添加在(0, GraphConstants.PERMILLE / 2) ,“(GraphConstants.PERMILLE / 2,0) , “ ( GraphConstants.PERMILLE / 2 , GraphConstants.PERMILLE ) , (GraphConstants.PERMILLE, GraphConstants.PERMILLE / 2) 。偏移的端口之间的连接边装置,它是可能的 边或顶点可能相互重叠。这不会发生的浮动港口。 图 41:一个顶点含有一些可见端口,其偏移值所示(整个矩形 顶点,标签属于端口,在这个例子中) JGraph 的用户手册 设置端口位置的第三种方法是这样做的绝对座标相对于 的顶点的起源。在绝对端口的相对位置的尺寸 顶点将不会保持不变,通过调整大小,但它们的相对位置的顶点 原产地。轴绝对是可配置的独立: GraphConstants.setAbsoluteX(地图,布尔) GraphConstants.setAbsoluteY(地图,布尔) 或两者同时使用: GraphConstants.setAbsolute(地图,布尔) 设置此标志后,您使用的端口的位置 GraphConstants.setOffset()方法了,这一次的 Point2D 参数 从顶点原点的绝对偏移量。 第四个方法是使用端口锚,这涉及到另一个端口定义,这 端口将被相对偏移。这个锚的锚,在 Port 接口 getAnchor setAnchor。另一个端口设置为锚使得该端口的起源 此端口,而不是顶点的原点。您还可以定义的偏移量中所占的比例

顶点尺寸使用只是 setOffset 的,或者你可以定义一个绝对偏移量为 值,使用 setAbsolute(地图,真实的)和 setOffset() 。锚定 机制是有用的,如果你想定义一个链的港口有固定的相对位置 彼此。注:端口锚 JGraph 的 5.6.2.1.x 被禁止在等待一个错误 分辨率。 3.6 小结 ?一系列的配置选项为默认的单元格的可视属性是 第 73 页 插图 42:绝对偏移的端口经常不正确地显示缩放父节点时, JGraph 的用户手册 通过存取方法 GraphConstants。 ?要添加一个新的细胞类型,定义新的单元格类,视图类和它的渲染器类。 自动创建的视图中使用的单元格视图工厂,并确保视图返回 在适当的方法(S)的渲染。 ?如果你想添加新的功能到一个单元格,你可能这样做:1)子类的属性 地图,添加新的属性类型,以支持新的功能,2)提供 细胞类,或 3)上的方法和变量的功能,通过将数据存储在 用户对象的细胞。 ?关于小区的一个重要的提示是,你只能通过细胞进入编辑,插入和 删除来电,从来没有细胞意见。

图模型的数据结构。这会导致的父单元, 也被称为组细胞,需要的最小边界矩形的边界 包含所有的孩子细胞。一旦分组,组细胞移动和调整大小 像一个独立的单元,但操作会影响所有的孩子细胞。 移动一组细胞,导致等于对孩子细胞(S)的翻译,缩放一组 细胞导致由相同比例的儿童细胞将其缩放。 第 75 页 图 43:移动组和调整大小 JGraph 的用户手册 4.1.1 图模型表示分组 如前所述,细胞,它们都在一个组组细胞的子细胞。这 关系可以嵌套任意次数,所以一组可以包含另一个组,并 等等。 最简单的方法组细胞编程方式设立的父/子 之前,所有组细胞(s)被插入的关系。注意:只有最上面的组细胞 需要指定在 insert 的调用,如果孩子的关系是正确前形成 插入。这可以使用 add()方法提供 DefaultGraphCell: vertex1.add(vertex2); 以同样的方式,我们增加了端口的 HelloWorld 示例的顶点。您也可以 使用构造函数的 DefaultGraphCell 儿童接受一个数组:

Object []的孩子= {vertex2,vertex3,vertex4,沿 edge2,edge3}; DefaultGraphCell vertex1 新 DefaultGraphCell(新的的字符串“Vertex1”, 空,子女); JGraph.getDescendants(Object []对象)提供了一种方法来获取所有的 的后裔细胞(儿童)的单参数所指定的。随着 getRoots 方法,这两种方法结合起来,使主的命令,你应该 使用图中的所有细胞: graph.getDescendants(graph.getRoots() ); 只是获得根只会工作,只要没有组结构。 请注意,您必须显式创建组细胞以正常的方式,您可以创建任何 细胞。分组在一起的细胞数量不会自动创建一个母细胞。那里 是的 GraphLayoutCache 的 helper 方法: insertGroup(对象组,Object []的孩子) 第 76 页 图 44:图模型如何照顾 3 个顶点,3 条边 分组(额外的端口不是为了清楚地说明) JGraph 的用户手册 该组的单元阵列中的参数下的组中的细胞和执行 INSERT 命令。 然而,上述这些方法,不使不断变化的父/子 在编辑和调用的关系,也不是他们能够加入分组操作 的撤消历史上的一个 insert 调用的一部分。 () 对于这一点, 你必须使用一个 ParentMap。 4.1.2 PARENTMAP ParentMap 类定义的单元格的父/子关系。它可用于在 相应的编辑()和插入()调用 GraphModel 和 GraphLayoutCache,有一个 ParentMap 的作为其属性之一。 ParentMaps 是 图模型,编辑或图形布局高速缓存编辑存储的一部分,所以任何改变 父/子关系(s)是不可撤销的。 ParentMaps 的想法是描述 父/子关系,你想改变的图模型来表示,并通过 母公司地图编辑或插入方法。 ParentMaps 可以创建在以下三种方式之一。首先是要通过儿童和 父母的 ParentMap 构造: =新 ParentMap parentMap ParentMap(子女,父母); 这会导致儿童阵列有父地图中指定的父。要调用 这种变化致电: graph.getGraphLayoutCache.edit(NULL,NULL,parentMap,NULL); 请注意,您还可以更改单元格属性的第一个参数相同 时间为改变组结构,使用 ParentMap。在编辑调用 组结构进行的更改将被存储为之前的分组结构 编辑呼叫。这使得撤消/重做能够恢复当前和以前的状态。 创建一个父地图的第二个方法是构造的类,既可以使用 默认的构造函数,在构造函数中刚刚提到的,然后增加其他一些项目使用 的的 AddEntry()或 addEntries()方法。 addEntries 允许您指定 多生几个孩子一个单亲的 AddEntry 一个孩子,和相关单

父父地图。这些方法的一个或多个条目对象 ParentMap 每个 Entry 对象代表一个父/子关系。 ,当我们描述 ParentMap,和它是如何由一定数目的输入 对,记住,任何进入对母公司可能是空的。这是你如何代表 一个父母双亡的细胞,即细胞,你要添加的模型根。归纳整个 概念的母公司地图,有三种操作,您可以用它来形容。下面我们 显示这三个操作: 1。您目前有没有父的细胞,你想分配给它的父。添加一个条目, ParentMap 的子细胞和新的父。 ParentMap(下午)=新 ParentMap(); 第 77 页 JGraph 的用户手册 pm.addEntry(childCell,groupCell); 2。您目前有一个细胞与父母,你希望它没有父。添加一个条目, ParentMap 的孩子,并设置为 null 父的细胞。 Object []的孩子=的{childCell}; ParentMap(下午)=新 ParentMap(childCell,NULL); 3。您目前有一个细胞与父母,您希望将其分配给不同的父。添加 进入 ParentMap 的子细胞和新的父。 ParentMap(下午)=新 ParentMap(); pm.addEntry(childCell,newGroupCell); 其他的例子,你可能会发现有用的组选定的单元格的操作: DefaultGraphCell,组=新 DefaultGraphCell(); 编辑(NULL,NULL,新 ParentMap graph.getGraphLayoutCache() 。 graph.getSelectionCells()(组) , ,NULL); 操作取消组合选定的单元格: 编辑(NULL,NULL,新 ParentMap graph.getGraphLayoutCache() 。 graph.getSelectionCells()(NULL) , ,NULL); 4.1.3 本集团插图 GraphConstants.setInset()也可以用于对组细胞提供一种 的子细胞和细胞之间的最小边界矩形边界 本身。 4.1.4 进入/移出群组 在 JGraph 类存在两种方法,setMoveIntoGroups(布尔) 第 78 页 插图 45:A 组细胞的插图 10 JGraph 的用户手册 setMoveOutOfGroups(布尔) 。这些确定与否作出单元部分 一组电池,当你拖动单元格或完全的一组细胞。所以,用 setMoveIntoGroups 设置为 true,运动细胞,使鼠标的位置是里面的 现有的可见组细胞的界限会导致细胞变成直接的孩子 组。 setMoveOutOfGroups 设置为 true,拖着一个孩子一组细胞内 完全脱离组细胞会导致细胞成为根细胞,即没有父。 4.1.5 移除子细胞

使用 remove()方法调用的一组结构的一部分的细胞,是略有不同, 其他的编辑调用的模式。如果你调用删除的顶点 3 和 4 如下图所示: 这些细胞将被删除的组结构和离开: 第 79 页 图 46:A 组 单元 3 和 4 的结构之前 被删除 图 47:组结构 后删除()调用 JGraph 的用户手册 呼叫删除()只有通过在 vertex1 的将是,从本质上讲,取消组合命令 同样适用于作为一个组中的任何单元格。如果你想删除整个 你需要调用 JGraph.getDescendants(对象) (或使用组结构 方法相同在 DefaultGraphModel 名称)上的最上面的父单元,得到 集合,其中包含的细胞和它的所有儿童,然后通过所有这些细胞的 remove()方法。 4.2 ConnectionSet ConnectionSet 的三个主要参数是最后的插入和编辑电话, 其他两个分别是嵌套的属性和父地图地图。一个 ConnectionSet 任何数量的边缘描述连接状态等也被存储的一部分,任何 编辑更改对象,使正确的撤消/重做。 的设计的 ConnectionSet 类似于的 ParentMap 的,是有 整体类持有一个或多个条目,或在这种情况下的连接,并且它们可以被设置 向上通过构造函数中,单独或作为一个集合。 将 ConnectionSet(物体的边缘,对象端口,布尔源) 相关联的指定端口和边缘,也创建了一个简单的 ConnectionSet 指示不论该端口是在源或目标端的边缘。这将创建一个 Connection 对象,这是一个内部类 ConnectionSet,并把它添加到的集合 持有的连接。您还可以创建自己的一组连接,并通过它使用: ConnectionSet(下集) 个别连接可以使用: 连接(物体的边缘,对象的源对象的目标) 设置在 ConnectionSet 边缘有指定的源和 的目标, 连接(物体的边缘,对象端口,布尔) 设置边缘被连接到端口的内 ConnectionSet 和 是否是源或目标端口是由布尔参数。另外: 断开(物体边缘) 设置作为在两端断开的 ConnectionSet 和内边缘 断开(物体的边缘,布尔源) 中断源或目标端,指定在 ConnectionSet。 也是静态实用方法,ConnectionSet.create() : ConnectionSet 创建(而 GraphModel 米,Object []的细胞,布尔断开)

这将返回一个新的 ConnectionSet 实例的基础上电池阵列,通过在 第 80 页 JGraph 的用户手册 其中包含的边缘和/或端口。如果断开是真正的 ConnectionSet 返回介绍了这些指定的单元格处于断开状态。如果这是真的,它描述了 边缘连接到 model.getSource(手机) model.getTarget(小区)和端口根据返回值 port.edges() 。 4.3 GraphLayoutCache GraphLayoutCache 持有细胞意见,模型中的每个单元格。它拥有 细胞的列表视图根和另一个缓存列表中的端口视图出于性能方面的考虑。 GraphLayoutCache 还拥有一个映射,从细胞到细胞的意见,唯一的地方 JGraph 的,在这里你可以翻译在模型中查看的方向。 GraphLayoutCache 其实实现的 CellMapper 的接口,该接口定义的方法来添加,并得到 细胞和细胞意见之间的映射。的 CellMapper 接口是没有这样一个明显的 设计作为而 GraphModel 的合同,但获得细胞的细胞时, 必须始终使用 getMapping 的: (cellView = graph.getGraphLayoutCache) 。getMapping(手机); 反向映射是没有必要的,因为从图形视图,图形 CellViews 有其相应的图形单元的引用。眼看作用 GraphLayoutCache 的 戏剧中的模型和视图之间的映射域,它可能会更有意义 ,为什么 GraphLayoutCache 持有的 CellViewFactory,工厂类 创建取决于细胞类型的细胞的意见。 4.3.1 VIEW-LOCAL 独立性 GraphLayoutCache 对象提供覆盖信息的手段举行 在图形模式,使同一型号的,你可能有多个独立意见。这 使细胞的知名度,本地查看属性和展开和折叠等功能。 要建立一个 GraphLayoutCache,在设定其部分属性,以这种方式,您需要 真实的,这是必须做构造函数的 GraphLayoutCache: GraphLayoutCache(而 GraphModel 模型,CellViewFactory 工厂,布尔 部分) 要改变部分的 GraphLayoutCache 状态,在其一生中会导致 严重的同步问题所以 setPartial 的()方法还没有提供。 一旦 GraphLayoutCache 已部分是有差别 功能之间进行的编辑方法 GraphLayoutCache 图表上的模型。他们表演的 GraphLayoutCache 将随时更新 查看你正在执行他们的图模型进行更改 模型,但不是在任何部分 GraphLayoutCache 的反映这些变化。所以,如果你 细胞直接插入到模型中,他们将不会出现在意见 GraphLayoutCache 是局部的。这是推荐的技术,用于插入 看不见的细胞。 的命名的部分属性的原因是为了表明 第 81 页 JGraph 的用户手册 GraphLayoutCache 是一个部分表示是什么样的模型中,虽然

边界的情况下的内容都是相同的,它是整个表示。 4.3.2 能见度 随着部分 GraphLayoutCache,你可以设置任何单个细胞是 无形的: graph.getGraphLayoutCache() 。对我有用(细胞,FALSE); 这将执行对你的编辑和相应的更新。您还可以定义一组 可见细胞和另一组的细胞在一个不可见的调用使用: setVisible(Object []对象可见,Object []的无形) 一个单元被设置为不可见的,只是意味着它不被显示在该视图中,模型 保持不变,只有 GraphLayoutCache 拥有额外的可见性信息 当部分。 4.3.2.1 配置能见度编辑操作后, 有许多配置选项进行编辑操作,自动处理 细胞有一定的关系图中的模型的可见性问题。例如, 如果一个顶点无形的,它通常不会让意识离开的边缘连接到该 顶点可见。 hidesExistingConnections 变量设置为 true,确保这 发生,真正的是其默认值。 对于相反的操作,showsExistingConnections 判定是否 已连接到它的两个顶点的边,成为可见的可见自己。 “ 再次,默认情况下是,真实的。 showsChangedConnections 确定是否应边缘 可见,当他们重新连接到不同的顶点都是可见的,默认为 如此。 showsInsertedConnections 确定是否插入的边缘应我 可见,如果任其来源或目标已经初见端倪,默认值是 true。 最后,hidesDanglingConnections 判定是否边缘应 看不见的时候可以连接顶点从模型中删除。默认情况下,此 值是 false 4.3.3 VIEW 本地属性 能见度在 JGraph 的重要观点无关的特性之一。另一种是 viewlocal 属性。本地查看属性,让你有任何可用的属性类型( 在 GraphConstants,或任何额外的属性,你可能定义)存储在本地值 细胞视图存储的属性地图和该值覆盖该值存储在存储 相应的图形细胞模型的属性映射。有两个变量的 GraphLayoutCache,支持此功能,allAttributesLocal 和 第 82 页 JGraph 的用户手册 localAttributes。 allAttributesLocal 是一个布尔标志,确定是否所有 本地视图属性,所有属性都设置在 GraphLayoutCache 存储在本地 在细胞内的意见,而这些都是用于可视化的属性。 localAttributes 是一个集属性键(例如 GraphConstants.BOUNDS, GraphConstants.FONT 等) ,使用的单元格中的值较视图属性映射 图中的细胞模型。您可以查看本地使用的所有属性设置:

setAllAttributesLocal(TRUE); 的值设置 localAttributes 使用: setLocalAttributes(AttributeSet 的); 注意局部属性集的设置覆盖当前集,它不添加到它。 因此,如果你想添加到它,请致电 getLocalAttributes() ,并添加到该集合 中得到的就地。 请注意,如果你想删除一个本地视图属性,这需要的不仅仅是 删除该注册表项从当地的属性集。也应去除的属性值 所有细胞具有该属性设置。根据应用程序的要求,您 将保留的属性删除或重新将它们添加到等价的图形模型细胞“ 属性映射。从 JGraph 的 5.6.3 起的方法 removeLocalAttribute(的对象属性,布尔 addToModel) , 可在 GraphLayoutCache 协助这一进程。该属性是关键 被删除,该标志指示是否要重新添加删除的属性 模型细胞。 正如前面提到的,如果您执行插入调用模型的局部布局 高速缓存中,细胞是不可见的,以从在布局缓存。如果您执行编辑的 模型,你改变一个属性,它的价值是本地视图图中的布局高速缓存, 不会被传递到细胞意见的属性映射。同样,如果您执行编辑 直接上图布局高速缓存任何本地视图属性不会传递到模型中 细胞。这意味着你可以有颜色,单元格的位置和大小,文字的字体,任何属性 在的 GraphConstants 在一个视图中显示不同的使用部分布局 高速缓存,设置相应的属性是本地视图和编辑这些属性 编辑呼叫部分的布局高速缓存。 在示例目录下,包你收到本用户手册中,你会发现 的文件 org.jgraph.example.GraphEdMV.java。这是一个例子 一个简单的多视图应用程序的执行。下面的代码的构造函数中 GraphEdMV 设置的看法本地的属性: 设置 localAttributes =新的 HashSet(); localAttributes.add(GraphConstants.BOUNDS); localAttributes.add(GraphConstants.POINTS); localAttributes.add(GraphConstants.LABELPOSITION); localAttributes.add(GraphConstants.ROUTING); graph.getGraphLayoutCache() 。setLocalAttributes(localAttributes); 第 83 页 JGraph 的用户手册 将所述小区设置的位置和大小,边缘点和路由和标签的位置,以 可以查看独立。 4.3.4 展开和折叠组 JGraph 的支持分组细胞的膨胀和崩溃。很显然,在自己的 应用程序不要求用户进行分组操作,这样你就会 一般有一些手段来确定哪些细胞的用户是指在一个崩溃 操作和执行的分组和折叠在一个操作中。 GraphEdX 的例子演示了手动分组展开和折叠

的细胞。下图显示了一个选定的单元格进行分组,折叠和展开 再次。 GraphEdX 源代码可以找到你的用户在 examples 目录 手动或 JGraph 的安装。演示渲染一小“ - ”或“+”在左上角 的组电池,以指示该组给予被折叠和展开。鼠标 在那个角落的新闻事件需要被抓获(见第 5 章,事件)触发的调用 展开和折叠。 导致细胞崩溃的实际调用的是: graph.getGraphLayoutCache() 。崩溃(graph.getSelectionCells() ); 并扩大: graph.getGraphLayoutCache()扩展(graph.getSelectionCells() ); 作为单一的参数传递中的细胞(S)是一组细胞。您可能会注意到, 边缘结束从 11 进组细胞的在外线组 崩溃了。此行为是标准的视觉折叠和展开。当细胞是 它是无形的检查,看看他们是否有一个可见的母公司,直接或间接的。如果是的话,任 何边缘 连接到看不见的细胞有促进作用,仅在终止在周边 点的第一个可见的父单元。在这个过程中有没有模式的转变。 第 84 页 JGraph 的用户手册 例如,在一个用户应用程序的情况下,涉及一树结构,该结构还可以扩大 和崩溃,你可能更喜欢渲染“ - ”的所有单元格的基础上。用户点击 该符号会导致应用程序找到下面的单元格,树节点,组 节点本身,然后折叠组,所有在一次操作中。 4.3.5 其他 GRAPHLAYOUTCACHE 选项 GraphLayoutCache 有一些更直观的配置选项: ?autoSizeOnValueChange - 当设置为 true,所有的顶点调整他们 首选大小加上任何插入的值的单元格视图属性映射每次他们的标签文字 的变化。这可能被视为一个全球覆盖的每单元自动调整功能 功能。本功能后,每单元自动调整大小之间的重要差异 属性是 autoSizeOnValueChange 的你仍然可以手动调整细胞。 ?selectsAllInsertedCells - 判断是否选择插入的细胞。 的默认值是 true。 ?selectsLocalInsertedCells - 确定是否本地插入单元格, 即,细胞插入的部分的图形布局缓存,被选中。默认值是 如此。 第 85 页 图 48:一个选定的单元格进行分组(2) ,倒塌(3)再次扩张(4) JGraph 的用户手册 4.4 高级模式功能 4.4.1 型号订购 的图模型有其细胞定义由根系集合的顺序的顺序。 访问时,他们从父和子细胞也确定性下令 整个模型有一个订单。在图上进行分析时,这是很重要的 模型或布局,因为这个顺序意味着结果可以依靠是

确定性。在模型中的顺序也被用于使细胞分层。 分层涉及任何单元格可以重叠的方式,任何其他需要有 其中一些方法来确定哪些单元格位于前。规则是在细胞 从根开始在于最背面层时,每个连续的根单元在于待下一次的 层,直到你达到的根源在于最后一个项目的顶层。如果您 进行插入操作,增加了两个细胞的细胞中被插入的顺序是相同的 传递到插入物()中的单元阵列的顺序。第一小区将是第一个进入 在分层结构后面的第二根和谎言。 无论你如何拖动单元格,单元格插入第二仍将超过第一 当他们重叠。由于组的子细胞完全位于边界的组 细胞,全组有根细胞层的位置。在组内的每个级别 任何级别的第一个条目的子单元进行排序,并再次,在于大多数的背面层上 在该组中。这种模式一直持续到任意的嵌套层次。 而不是提供细胞层的超细晶粒的定位,它是更有效的 仅仅是能够指定的一组细胞移动到最背面层: toBack(Object []的细胞) 或最重要的层: toFront(Object []的细胞) 这些方法中存在的 GraphLayoutCache 类和而 GraphModel 接口。需要注意的是一些可能会受到影响的细胞和细胞不能共享相同的层。 因此,操作将指定的细胞来开始或结束的曲线图的水平 第 86 页 图 49:分层产生 从插入的两个细胞 JGraph 的用户手册 结构存在的根据,但这些细胞之间保持相同的相对顺序。 4.4.2 EDITS 当你执行一个插入,编辑或删除调用,创建一个对象调用编辑。在 而 GraphModel 的情况下调用的一个 GraphModelEdit 对象被创建和调用 除了创建 GraphLayoutCache 一个 GraphLayoutCacheEdit GraphModelEdit。这些编辑对象封装的变化,保持信息 使用嵌套的属性参数的属性图的变化,改变的 组结构,使用母公司的地图参数和更改的连接状态 使用连接设定的参数。 一些简单的编辑调用 GraphLayoutCache 不提供所有的这些 参数,但他们的值创建的内部和在编辑对象持有 必要的。编辑对象的完全描述的变化,从目前的状态, 图到下一个状态和反向,所以被用来执行撤消和重做功能。在 事实上,编辑方式进行编辑对象和执行,完全 作为一个重做命令功能相同。 4.4.2.1 撤销/重做 撤消支持,即,存储执行到目前为止的变化,通常是 在应用程序级别实施。这意味着,JGraph 的本身并不提供一个运行 历史,它只是提供的类和方法,以支持它在应用程序级别。这

是因为历史需要的内存空间,这取决于它存储了多少步 (它是一个应用程序的参数) 。此外,历史并不总是为一些实施 应用程序并不需要它。 GraphChange 对象发送给已经 UndoableEditListeners 的 与模型注册。对象因此,实现的 GraphChange 的接口 和 UndoableEdit 接口。后者则用于实现撤消支持,因为它 提供的撤消和重做的方法。 (要执行的代码,撤消和重做的变化 存储在对象,并沿的听众。 ) 4.4.2.1.1 撤消支持继电器 除了从模型,图表视图中也使用的代码,该模型提供给通知 其撤消听众的一个不可撤消的变化。这是可以做到,因为每个视图通常具有 参考模型,而模型中没有提到他们的意见, ( 。 而 GraphModel 接口使用的第四个参数允许中继 UndoableEdits 编辑方法) 。 GraphLayoutCache 类使用模型的撤消支持通过 创建 UndoableEdits,它已到 UndoableEditListeners, 与模型注册。同样,到的听众对象包含的代码 执行的看法上的改变,也撤销和重做代码给定的变化。 这具有以下优点,GraphUndoManager 必须只被连接到 模型,而不是模型和每个视图。 第 87 页 JGraph 的用户手册 4.4.2.1.2 GraphUndoManager 导致的变化,单独的几何形状,它们被存储独立的模型, 可能是唯一可见的,不影响其他的意见,或在一个视图(视图) 模型。其他的意见是不知道的变化,如果其中一人要求撤销,这有 加以考虑。 Swing 的 UndoManager 在形式 GraphUndoManager 是延伸 撤消或重做多个视图的背景下,这种变化。 GraphUndoManager 增加了一个额外的参数的撤消和重做的方法, 它允许指定的调用视图上下文的 Undo / Redo 操作。基本 创建并设置图撤消管理器的代码是: undoManager =新 GraphUndoManager(); / /注册 UndoManager 模型 graph.getModel() 。addUndoableEditListener(undoManager); 通过到的 GraphUndoManager 的的参数是撤消和重做法, 用于确定相对于调用视图的最后一个或下一个相关的交易。 相关手段可见,在这种情况下是不可见的,所有的交易 调用视图被撤消或重做含蓄,直到下一个或最后一个可见的交易 找到指定的参数。 作为一个例子考虑下面的情况:两个视图共享相同的模型和 都有至少一个视图本地属性。这意味着,每个视图可以改变 独立地,并且如果该模型的变化,两个视图都更新。模型将通知其 的意见,如果细胞中添加或删除,或倘本集团的结构或连接的图形是

修改,这意味着已经改变的源或目标端口中的一个或多个边缘。 如果视图的本地属性点或边界和细胞移动,调整大小, 点添加,修改或删除边缘,那么这些修改视图 交易。所有的意见,但在源代码视图不知道这样的看法交易, 因为该等交易仅在源视图中可见。 第 88 页 在多个视图图 50:索马里发展事务处 JGraph 的用户手册 在上面的图中,显示的状态的命令历史记录后一个单元格插入到 的模式,移动的第二种观点,与第一种观点的后续举动。插入后 到模型中的细胞,细胞的位置是一样的,在各方面的意见,即位置 被传递给插入呼叫。箭头表示要撤消的编辑 GraphUndoManager 为各自的看法。在视图 3 的情况下,只能看到 插入,所有的编辑都被取消。 如上所述,即使有很多可能的来源通知 这一撤消支持,实施 GraphUndoManager 只有一次,即存在 在该图的模型。因此,GraphUndoManager 必须只可添加到一个全局 入口点,这是 GraphModel 对象。 4.5 拖放 拖放指的行动中的用户的选择的 GUI 对象的可视化中,通常会 在对象上点击和移动鼠标的同时按住鼠标按钮。 “ “下降”的一部分,是在释放鼠标按钮。 AWT 和 Swing 中,这意味着 在一个组件中选择一个视觉元素,和滴在另一个。如果你没有使用 DND 之前,很值得一读的标准 Swing 机制 http://java.sun.com/docs/books/tutorial/uiswing/misc/dnd.html 作为 JGraph 的主要是 符合的标准机制。 JGraph 的支持拖放以同样的方式,大多数 Swing 和 AWT 组件, JGraph 的情况下,支持核心库中拖放之间。 “ 方法 setDropEnabled()和 setDragEnabled()的 JGraph 对象 控制这些功能是否可用。与大多数组件,默认情况下, 降并拖动创建一个 JGraph 的禁用后启用。 信息 - 从 Java 1.4 开始,一个高层次的事件监听器 TransferHandler 的是简单地拖放。这是唯一的 Java 1.4 JGraph 的特征和功能,构建系统的掉期出具体的建设时 Java 1.3 中。的 Java 1.3 的的拖放框架,是较为复杂的使用和 本说明书中,将不进行描述。 有两个重要的接口定义在 Swing 中拖放, 可转让的,TransferHandler 的。转让实现描述 实际的对象(s)被转移。在可转让的实现(这是一个 接口)引用的 DataFlavor 实例描述的格式的数 可转让的数据可能需要。例如口味的 stringFlavor, imageFlavor javaFileListFlavor。 在的情况下 JGraph 的 org.jgraph.graph.GraphTransferable 定义了一个 描述的曲线图转印。它拥有的细胞被转移,ConnectionSet

细胞和 ParentMap 描述的组中的结构之间的连接。此外 有是一个嵌套 AttributeMap,与细胞的属性和集体的边界 细胞为一个矩形。此信息足以重新创建图形时下降(通常是 第 89 页 JGraph 的用户手册 在 JGraph 的组分) 。 另外一个重要的元素拖放的 TransferHandler 类。这 类负责创建的 Transferables,通过的 createTransferable 的() 方法,并处理他们的解释时下降。当一个 TransferHandler 接收使用其 canImport()方法,以确定是否可转让对象 它是不是能够接受所提供的 DataFlavor。的 ImportData() 方法处理的实际过程中接受的下拉,在一个 JGraph 的情况下 成分,适当地编辑图形。如果你想改变默认的降 行为,它是一个的覆盖 importData()方法,你可以这样做。 JGraph 的有因为非 Swing 的标准功能,它的子类的 TransferHandler 拥有。 org.jgraph.graph.GraphTransferHandler 是默认的处理程序 导出和导入图形。这是必要的,原因是该标准 TransferHandler 的传输 bean 的属性和图形的选择不能 作为一个 bean 的属性实现。从其他 GraphTransferHandler 明白下降 的 JGraphs,而不是从其他 Swing 组件在默认情况下。一个常见的问题是如何 接受比 JGraph 的其他的成分的 JGraph 的下降。有两个可能的 这样做的方式。 第一种方法是使你的图形理解等进口数据的口味。要做到这一点 需要创建一个子类的 GraphTransferHandler 和覆盖 canImport 的() importData() ,以确认该对象可以进口,然后以正确 办理进口。核心 GraphTransferHandler importData()会给你 一个合理的想法如何执行一个特定的进口 JGraph 的操作。 第二种方法,以适应 TransferHandler 的出口部件, 特别是 createTransferable()方法,它创建了一个 默认情况下,GraphTransferable JGraph 的理解。这个机制是唯一有用的 如果唯一的数据将被导出到一个 JGraph 的,因为没有任何其他成分 了解如何导入图形。 要设置一个新的 TransferHandler 上的图形调用: graph.setTransferHandler(新 MyGraphTransferHandler() ); 在 Java 需要一个小提,当您执行剪切,复制或粘贴剪贴板 通过剪贴板进行操作拖放。在 Java 中,系统(操作系统 系统)剪贴板中,剪贴板,您在您的应用程序中创建的任何其他情况下。 一个数据传输过程中,这些店转让对象。如果您使用的共享系统 剪贴板中的数据将被传输到本机操作系统的剪贴板,这样你就可以 将数据传输到它仍然有它在另一个 JVM 会议。如果这是不 行为然后,你需要创建一个 Clipboard 只为你的应用程序的实例。 偶尔会造成混乱的一个问题是,当开发者试图写入功能 在图表上的重量级细胞上可以接受滴。的问题是与使用指南 renderering 轻量级的模式(即只有一个渲染器组件共享

所有类似的细胞类型) 。当你拖动一个重量级的组成部分,它不 真的有一个组件实例(除了当编辑,因为编辑器组件 实例处于活动状态的时间) ,即你把 JGraph 上画的东西拖放到 组件。因此,您的汇款处理的 JGraph 的需要来处理这一下降,有没有 第 90 页 JGraph 的用户手册 细胞的组成部分来处理它。您可以使用 getNextViewAt 的()方法 jgraph 的,以确定其中发生的下拉。一个明智的下一步将是通过 drop 事件,以该组件调用 getRendererComponent() 实际安装的组件,重量级,并把它 drop 事件处理。 4.6 缩放 JGraph 类内存储当前图形的标度,并可能会被改变 通过 setScale()方法。该表是存储作为双类型和值 1.0 是 默认情况下,不成比例的状况。高于 1.0 的值是指一个比例的曲线图(变焦 )值低于 1.0 表示图形缩小。设置规模为 2.0 对应到 x2,4.0 x4 的放大,放大 0.5 X0.5 倍率(X2 还原) ,依此类推。 setScale(double)方法在屏幕上放大离开中心点 不变。如果该点周围的缩放是不中心点, setScale(双,Point2D 的)方法,其中的一点是新中心 图。这是有用的,例如,当变焦到一个特定的鼠标点击点或 指定的滚动区域。 4.7 小结 ?分组的图模型结构的一部分,并表示通过父/子 细胞之间的关系。 ?编辑方法可以使用母公司的地图和连接套来形容一个新的状态 分组的结构和连接状态。 ?GraphLayoutCache 可以进行局部的,这意味着某些或任何细胞视图 它可以制成在不可见的。该技术可用于细胞的展开和折叠。 ?手机的看法可能有鉴于本地属性,它们会覆盖在相应的 图细胞模型。哪些属性视图本地在 GraphLayoutCache 定义。 ?撤消和重做是内置的编辑方法,并遵循 Swing 标准。一些 额外的功能时,需要处理索马里发展事务处/重做多个独立的 意见。 ?当一个模型或布局缓存发生变化,有可能有一个侦听器检测到这种 改变,并获得改变对象,研究这种变化的细节。 ?鼠标事件传递到 MouseHandler 默认情况下,从有到通过 特定背景下的特殊处理,处理程序或处理程序。 第 91 页 JGraph 的用户手册

5 活动 5.1 走势变化的事件和监听

该而 GraphModel 定义方法的两种类型的处理和登记 听众,UndoableEditListeners GraphModelListeners。所有的 通知的撤消侦听器模型侦听器的通知,因为伴随着 需要更新和显示重新绘制的观点。然而,模型的事件不 触发取消事件的原因很明显。 如果你想有一定的功能时触发的触发模型上的事件, 人,必须实现 GraphModelListener 接口指定了一个方法, graphChanged(GraphModelEvent E) 。需要注册的监听器 模型,以接收这些事件: graph.getModel() 。addGraphModelListener(graphModelListener) 一旦发生变化时,你将能够以确定的细节的变化,由 审讯的事件。 图模型和图形布局高速缓存支持这种事件模型。该图 布局缓存事件仅包含特定于该视图的信息变动,即以查看本地 属性和当地能见度的变化。如果是部分或完全没有本地视图图形布局高速缓存 编辑属性或状态变化过程中,图形布局的缓存事件将是空的, 只图模型的事件包含任何信息。在这样的图形布局缓存事件 可以用来确定发生了什么只在一个视图。什么样的全貌 编辑过程中改变,因此,确定检查的图形模式 事件和图形布局缓存事件。如果你的图表布局缓存不是局部的,并没有 然后本地查看属性研究图模型,事件就足够了。 ,GraphModelEvent 和 GraphLayoutCacheEvent 都在 org.jgraph.event 包。在这些类别中定义 GraphModelChange 和 GraphLayoutCacheChange,这些内 事件接口上使用的 getChange()方法,可以得到变化对象。 这些变化是在模型中的插入,删除或修改的细胞构成。 请注意,这些对象中包含的描述和在一个执行的变化 的地方。 必要的 getter 方法来抽取信息的 GraphModelChange getConnectionSet,getPreviousConnectionSet,getParentMap getPreviousParentMap。 GraphLayoutCacheChange 接口定义 getChanged,getInserted,getRemoved 的 getAttributes 和 getPreviousAttributes。 GraphModelChange 扩展 GraphLayoutCacheChange,所以也会在第二列表中定义的方法。 从命名的方法,你会很容易地能够推断出如何访问 预编辑后的编辑版本的对象,用于存储编辑状态下,父地图, 连接集和嵌套的属性映射。 getInserted 回报的细胞, 插入编辑,getRemoved 那些被删除的编辑和 getChanged 的 返回编辑之前和之后存在的那些细胞,但其属性改变 第 92 页 JGraph 的用户手册 该编辑。 请记住,在你执行撤消,以前和当前属性的 周围编辑是 swopped 的。这是为了让重做功能正常工作。

5.2 GraphUI 和处理鼠标输入 org.jgraph.plaf.GraphUI 接口提供了 UI 委托接口 JGraph 的继承自 ComponentUI 中。默认情况下的实施,BasicGraphUI, 提供了所有你期望的常用方法作画,更新和返回组件的尺寸。 然而,最常见的困难用户进入 JGraph 的工作 鼠标事件进入 JGraph 的,和他们之间传递的各种鼠标 处理函数。 BasicGraphUI 定义的方法 createMouseListener, ,安装一个 () 鼠标处理程序的图形用户界面。如果您的子类 BasicGraphUI 和创建自己的 鼠标处理程序,记得覆盖 createMouseListener()来创建你的鼠标 处理程序。同样的想法也适用于任何其他自定义功能添加到你的子类, 打电话给 createXXX 的()方法可在 BasicGraphUI。 看看在 MouseHandler 内部类 BasicGraphUI。这是所有 默认情况下,鼠标输入事件 JGraph 的。它提供了 mousePressed, mouseDragged,mouseMoved,mouseReleased,你所期望的。 mousePressed 发生的第一件事情就是处理程序设置为 null。这是处理程序 是要处理的鼠标事件。 MouseHandler 经过一系列的检查, 工作是什么,当它被按下的鼠标。 略低下来,你会发现这一行: 的 int = graph.getTolerance(); 5.2.1 MOUSE TOLERANCE 当用户试图选择一个单元格,JGraph 的使用提供了一些援助 在 JGraph 的耐受性变量。当按下鼠标时默认的鼠标处理程序 创建一个矩形的鼠标事件发生的位置。的距离 这个矩形的中心,任何一方是从 getTolerance()返回的值。这是 在此矩形,JGraph 的将处理的细胞。如果你发现你有 重叠的细胞和正在处理错误的电池由于公差值,只需 将它设置为 0。 该生产线后 getTolerance 调用内容如下: Rectangle2D 的 R = graph.fromScreen(新 Rectangle2D.Double(e.getX() - , e.getY()2 - ,*,*第 2) ); 第 93 页 JGraph 的用户手册 5.2.2 ZOOMING JGraph 的使用 Graphics2D 类来实现它的变焦。该框架是 featureaware, 这意味着它依赖的方法,以便扩展点或矩形屏幕或 模型坐标,这反过来又 JGraph 对象中所提供的。通过这种方式,客户端 代码是独立于实际的变焦倍率。 由于 JGraph 的缩放上实现了 Graphics2D 类的顶部,画 图形对象使用非缩放坐标(实际缩放是通过 图形对象本身) 。出于这个原因,JGraph 的总是返回,并预期非规模 坐标系。 例如,当执行一个 MouseListener 响应鼠标点击, 事件的点都必须到模型坐标的 fromScreen 的按比例缩小

为了找到正确的通过 getFirstCellForLocation 细胞的方法 方法。 另一方面,原来的点通常是用于在组件的上下文中,用于 例如弹出一个菜单鼠标指针下的。确保克隆点 改变, ,因为 fromScreen 修改参数的地方,即无需创建一个 克隆的对象。从模型到屏幕上,例如要缩放的位置, 顶点组件上,toScreen 的的方法被使用。 继续进一步在源代码 BasicGraphUI.mousePressed 有是 调用到 isForceMarqueeEvent。 5.2.3 MARQUEEHANDLER “字幕在 JGraph 的是矩形选择(有时称为”橡皮筋“ 选择) ,你当你把 JGraph 的空白区域单击并拖动。 “ BasicMarqueeHandler 类是用来实现这种类型的选择。从 建筑的角度来看,选取框的处理程序是一个“高层次”的听众,被称为 低层次的听众,如鼠标监听器,它安装在 UI 委托。 关于它的方法,选取框的处理程序是类似的电池手柄, 因为选取框处理程序处理鼠标事件,并允许额外的绘画和 覆盖的字幕。 (选取框是构成一个矩形,该被选择 地区内。 ) isForceMarqueeEvent 检查以查看是否有任何机制是在当前 选取框处理程序启用强制转嫁到的鼠标事件处理 选取框处理程序。在 BasicMarqueeHandler 箱子中,这是由于通过按压并 持有的“ALT”键在鼠标操作。 5.2.4 把手 我们在第 3 章中提到的手柄,它是,我们实际上是直接在 BasicGraphUI 鼠标事件的手柄。 BasicGraphUI 存储当前 CellHandle 第 94 页 JGraph 的用户手册 句柄变量。这 updateHandle()的方法,该方法创建更新 细胞根据目前的选择状态的图形处理。 移动操作的鼠标事件将被传递给 RootHandle,这是 另一个内部类 BasicGraphUI。对于顶点鼠标的大小调整操作 ,事件将传递到 SizeHandle,这是一个内部类 VertexView 的。而对于 边移动和调整大小功能的鼠标事件,将被传递到 EdgeHandle 的, 这是一个内部类 EdgeView。 第 95 页 JGraph 的用户手册 6 个 I / O 和 JGraph 的应用 6.1 XML 持久性 Java 1.4 和更高版本提供了 XMLEncoder 和 XMLDecoder 机制 您的应用程序序列化的对象以标准的方式。你的一个例子 编码阶段可能看起来如下所示: 新的 XMLEncoder XMLEncoder ENC =(转出); enc.setExceptionListener(新的 ExceptionListener(){

公共无效 exceptionThrown(例外五){ / /与异常处理 } }); / /配置持久委托 enc.writeObject(对象); enc.close(); Java 使用的持久委托的机制,以确定哪些数据从一定 类需要被序列化。请注意,这是没有必要坚持把 JGraph 对象 使用 writeObject 方法,大多数应用程序只需要坚持 GraphLayoutCache。这包含了所有的图模型和视图几何 信息: enc.writeObject(graphLayoutCache); 如果你不熟悉的 XML 编码的使用,以及如何使用持久性 代表,它是太阳上使用 XMLEncoder 的文章值得一读。显然,写 自定义应用程序,您需要了解正确的持久委托 机制。它的基本思想是,你创建对应的类的持久委托 构造函数,你想被调用时,解码后的 XML。这些类 所描述的代表,必须是私有的,也不是必须的构造。这个类本身 必须是一个内部类,它是静态的,或存在于它自己的文件。此外,类 成员变量必须遵循 Bean 的属性设计中的 setXXX()和 getXXX()方法存在的每一个的变量 XXX,是要坚持。 作为一般指引如下所示的典型代表,使你坚持一个 简单 JGraph 的基本应用程序: XMLEncoder 编码器; 尝试{ 编码器=新的 XMLEncoder(OutputStream 中); / /更好的调试输出,如果你需要它 encoder.setExceptionListener(新的 ExceptionListener(){ 公共无效 exceptionThrown(例外五){ e.printStackTrace(); } 第 96 页 JGraph 的用户手册 }); encoder.setPersistenceDelegate(DefaultGraphModel.class, 新 DefaultPersistenceDelegate(新的 String [] {“落叶归根”, “属性”}) ); encoder.setPersistenceDelegate(GraphLayoutCache.class, 新 DefaultPersistenceDelegate(新的 String [] {“模式”, “工厂”,“cellViews”中,“hiddenCellViews” “部分”}) ); encoder.setPersistenceDelegate(DefaultGraphCell.class, 新 DefaultPersistenceDelegate(

新的 String [] {“userObject”}) ); encoder.setPersistenceDelegate(DefaultEdge.class, 新 DefaultPersistenceDelegate( 新的 String [] {“userObject”}) ); encoder.setPersistenceDelegate(DefaultPort.class, 新 DefaultPersistenceDelegate( 新的 String [] {“userObject”}) ); encoder.setPersistenceDelegate(AbstractCellView.class, 新 DefaultPersistenceDelegate(新的 String [] {“细胞”, “属性”}) ); encoder.setPersistenceDelegate( DefaultEdge.DefaultRouting.class, 的新 PersistenceDelegate(){ 受保护的表达实例( 对象 oldInstance 的,编码器输出){ 返回表达式(等于 oldInstance, GraphConstants.class, 的“getROUTING_SIMPLE”,NULL); } }); encoder.setPersistenceDelegate(DefaultEdge.LoopRouting.class, 的新 PersistenceDelegate(){ 受保护的表达实例( 对象 oldInstance 的,编码器输出){ 返回表达式(等于 oldInstance, GraphConstants.class, 的“getROUTING_DEFAULT”,NULL); } }); encoder.setPersistenceDelegate(ArrayList.class,编码器 getPersistenceDelegate(是 List.class) ); encoder.writeObject(graph.getGraphLayoutCache() ); encoder.close(); }赶上(例外五){ JOptionPane.showMessageDialog(图 e.getMessage() ,“错误”, JOptionPane.ERROR_MESSAGE); } 应当注意的是,以这种方式创建的输出可以是有点冗长的,甚至 小图。技术,以减少文件的大小是使用的 getConnectionSet 方法的 DefaultGraphModel。通过使用这种方法,之间的冗余 端口的边缘设置和边缘的源和目标字段可以从文件中删除。要做到这一点, 必须改变模型的持久委托获取的连接设置 第 97 页 JGraph 的用户手册

各自的方法,并把它传递给构造函数的施工时间: model.addPersistenceDelegate(JGraphpadGraphModel.class, 新 DefaultPersistenceDelegate(新的 String [] {“落叶归根”, “属性”,“connectionSet”}) ); 为了避免存储各自的特性的细胞,它们必须进行瞬态(其中 在前面的步骤中的静态初始化完成) : JGraphEditorModel.makeTransient(DefaultPort.class,“边缘”); JGraphEditorModel.makeTransient(DefaultEdge.class,“源”); JGraphEditorModel.makeTransient(DefaultEdge.class,“目标”); makeTransient 方法看起来像这样: 公共静态无效 makeTransient 的(A 类 clazz,String 字段){ 尝试{ BeanInfo 的信息 Introspector.getBeanInfo(clazz); 的 PropertyDescriptor []的 PropertyDescriptor =信息 。getPropertyDescriptors(); (INT I = 0;我 propertyDescriptors.length; + + i){ PropertyDescriptor 的 PD =的 PropertyDescriptor [I]; (pd.getName()等于(场) ){ pd.setValue(“短暂”,Boolean.TRUE); } } }赶上(IntrospectionException E){ / /与异常处理 } } 您将需要类似下面的代码来读取 XML 到您的应用。 请记住,你的对象将是你写的类型,在编码阶段。 的 XMLDecoder DEC =新的 XMLDecoder(中); (十进制= NULL){ 对象 obj = dec.readObject(); dec.close(); 返回 obj 的; } 返回 null; 请注意,GraphEdX 的例子自带的所有用户手册分布 演示的功能,加载和保存图形使用 XML 编码。 6.2 图像导出 使用的各种图像处理功能,可以在 Java 中,这是比较简单的 您的图形图像 JPEG,位图(BMP)或可移植网络图形 第 98 页 JGraph 的用户手册 (PNG)格式。 JGraph 类提供的一个实用方法的 getImage() 导出一个简单的任务。的 getImage()有两个参数,第一个是背景 的输出图像和第二颜色是任何插图被周围使用的图像的每一个侧

生产。 背景颜色,你不妨简单地将背景颜色的图形,但 PNG 输出格式有一个透明背景的选项。在该示例中 下面你需要使用自己的图形,自己的输出流,并选择一个合适的 背景,但此代码应在所有情况下: JGraph 的图形 getGraph(); / /替换自己的图形实例 输出流出来 getOutputStream 返回(); / /替换与输出流 颜色 BG = NULL; / /这使背景透明 BG = graph.getBackground(); / /使用这个使用图形背景 颜色 BufferedImage 的 IMG = graph.getImage(BG,插图); ImageIO.write(IMG,转出); 了 out.flush(); out.close(); 6.3 SVG 出口 有两种方法可用于导出 JGraph 的 SVG 格式。首先是 使用 Apache 蜡染库来执行的出口,二是本地生产 SVG 标记在你的应用程序。第二种方法是采用在 SVG 的例子 你可以找到的例子包,把 JGraph 布局 Pro 产品。本地写作 的的 SVG 输出提供大量的性能改进蜡染库。蜡染 库产生的输出,只使用了非常原始的图形元素等后处理 SVG 输出是不可能的,因为图形上下文是无法辨别从 输出。在写作的时候,的蜡染库,也缺少一些有用的功能, 如一个“超级链接”单元格或文本元素之间的关联。 第一种方法是目前最经常使用的一个,和将要描述的一个 在这里。从它的首页页面,该页面还提供了一个可以下载的蜡染库 一些有用的教程,使用的库。其基本原理是创建一个 SVGGraphics2D 对象和油漆的图形,如何做到这一点的最好解释 是代码本身,如下所示: 公共静态无效 writeSVG 的(OutputStream 中,JGraph 的图形,诠释插图) 抛出 UnsupportedEncodingException,SVGGraphics2DIOException { Object []的细胞= graph.getRoots(); Rectangle2D 的边界= graph.toScreen(graph.getCellBounds(细胞) ); (发展!= NULL){ / /构造的 SVG 画的图,用于发电机 DOMImplementation 来说 domImpl = GenericDOMImplementation 。getDOMImplementation(); 文件文件= domImpl.createDocument 的(NULL,“SVG”,NULL); 第 99 页 JGraph 的用户手册 SVGGraphics2D svgGenerator,=新 SVGGraphics2D(文件); svgGenerator.translate(bounds.getX()+插图,bounds.getY() +插图);

/ /绘制图形的 SVG 发电机,没有双 / /缓冲启用,以确保我们得到了矢量图像。 RepaintManager currentManager = RepaintManager currentManager(图形); currentManager.setDoubleBufferingEnabled(假); graph.paint(svgGenerator); / /写入到指定的文件的图形作为一个 SVG 流 作家作家=新的 OutputStreamWriter(“UTF-8”); svgGenerator.stream(作家,FALSE); currentManager.setDoubleBufferingEnabled(TRUE); } } 查看输出可以执行使用由 Apache Squiggle 的浏览器, Internet Explorer 中的 Adobe SVG 插件或 Firefox 1.5 或更高版本。在笔者的 经验与 Adobe 插件的 IE 浏览器在生产最佳质量的输出 写作的时间。 6.4 出口在一具无头环境 在* nix 系统的 X Windows 系统的体系结构意味着 Swing 要求 某种图形缓冲区写入。当使用 1.3 版本的 Java 虚拟 以 framebuffer 的是在这样的系统中导出的图像机(JVM) 需要,写入的缓冲液的情况下,会导致一个无头的异常被烧成。 请注意,Windows 系统不有有这个问题,因为它们不具有相同的 客户机/服务器的分离。随着普及的* nix 系统上的服务器端,常见的 要求的图形图像在服务器上,然后传输这些图像到 客户端浏览器可能是不平凡的。 此前,在* nix 系统中,您通常会建立了一个 VNC 服务器或运行 如果没有 X Windows 服务器提供的虚拟帧缓冲区。改变服务器 环境往往是不能接受的,所以从 JVM 1.4 的概念一具无头模式 被介绍给解决此问题。通过设置-Djava.awt.headless = TRUE JVM 参数选项,它是可能的轻型组件来创建实例。 太阳提供了一个有用的教程,讲解了在 Java 中使用 headless 模式。无论是核心 JGraph 的图书馆和专业 JGraph 的布局被设计在 headless 模式下正常工作。 要显示的轻量级组件,有必要将它们添加到一个重量级的 如窗口或一个帧的组成部分,它不能用于在 headless 环境。 ,而不是创建一个框架,调用 pack()的地方,有一个解决方案 您可以创建一个 JPanel,然后调用调用 addNotify()来达到同样的效果。虽然, 调用 addNotify()不严格意味着要调用的开发人员,这是一个被广泛接受的 解决方法: 第 100 页 JGraph 的用户手册 JGraph 的图形 getGraph(); / /替换你的图表实例 JPanel 的面板=新的 JPanel(); panel.setDoubleBuffered(假); / /总是打开双缓冲 时关闭出口

panel.add(图形); panel.setVisible(TRUE); panel.setEnabled(TRUE); panel.addNotify()/ /解决办法收拾一个 JFrame() panel.validate(); 颜色 BG = NULL; / /这使背景透明 BG = graph.getBackground(); / /使用这个使用图 背景颜色 BufferedImage 的 IMG = graph.getImage(BG,0); 使用上述的解决方法意味着你可以以同样的方式,你会在使用 JGraph 的 桌面 Swing 应用程序。还有另一种方法使用 JGraph 的,在不需要 把 JGraph Swing 组件的创建,这是在下面的章节有权 “工作中没有 Swing 组件”。 6.5 工作没有 Swing 组件 创建 Swing 组件并不总是需要的,例如,当一个 应用程序只能创建一个图形,适用于布局,最后提取的位置 通过 API。 JGraph 的 GraphLayoutCache 对象必须建立在以 获得大部分的可用的功能,以及作为一个实施 而 GraphModel 接口。把 JGraph 实例执行的任务的添加 作为一名倾听者 GraphLayoutCache 的而 GraphModel。如果没有 JGraph 的实例 被创建,它是建议,这是通过创建一个子类 GraphLayoutCache,该子类的工具 GraphModelListener。 这个子类都应该将自己添加为一个监听器模型和处理与图形的变化 适当。 把 JGraph 布局专业生产示例文件夹中有一个例子命名 com.jgraph.layout.JGraphHeadlessLayoutExample 这表明了 图简单图一 JGraph 的实例被创建的情况下被解雇了。 “ GraphLayoutCache 子类中实现了上述 com.jgraph.layout.DataGraphLayoutCache 类。 在一个 Applet 中的 6.6 JGraph 的 Java Applet 应用程序的扩展 JApplet 的类,可以很容易地创建和 引用一个页面的 html 中的 applet。 Java 的建议对静态引用 UI 因为这个原因,但 flyweight 模式的组件是一个中央部分的设计 JGraph 的,所以 JGraph 的重建需要一定的静态类引用,如果小程序 重新加载。 org.jgraph.examples.GraphEd 的例子是一个小程序,请参阅 第 101 页 JGraph 的用户手册 这一类的 destroy()方法。此方法重置 UI 的静态引用 在 JGraph 的组成部分。请注意,如果您的应用程序有更多的这样的引用,他们应该 重新以同样的方式,以避免出现问题 applet 时重新加载。 6.7 印刷 打印的 Swing 和 JDK 1.4 内置的 javax.print 包提供 在印刷过程中的详细控制。这包中包含 PrinterJob 的类 这是主要的打印控制类。使用打印的基本机制

下面的代码: PrinterJob 的 PrintJob = PrinterJob.getPrinterJob(); printJob.setPrintable(graphPane); / / graphPane 是一个 JScrollPane 在它的曲线图,例如 如果(printJob.printDialog() ){ printJob.print(); } 您需要一个 Swing 容器,实现了打印接口。这个容器 需要实现一个 print()方法被调用时调用的打印作业。这是 接口定义的唯一方法,它有三个参数:图形 图形上下文,PageFormat 的画页 - 描述的大小和 页并取向的 pageIndex - 要被绘制的页面的索引(从 零) 。 您可以使用标准的 Swing 打印功能,设置打印的元素是 是印刷,并开始打印: 公众诠释打印(图形克,PageFormat 的 printFormat,诠释页) 尺寸 PSIZE = graph.getPreferredSize(); / /图形是一个 JGraph 的 W =(INT) (printFormat.getWidth()* pageScale); H =(INT) (printFormat.getHeight()* pageScale); INT 列=(int)的 Math.max(Math.ceil( (双) (pSize.width - 5) /(双)W) ,1); 整型行数=(int)的 Math.max(Math.ceil( (双) (pSize.height - 5) /(双)H) ,1); (页<列*行) / /配置图进行打印 RepaintManager currentManager = RepaintManager.currentManager(本); currentManager.setDoubleBufferingEnabled(假); 双 oldScale:= getGraph() 。getScale(); getGraph() ,setScale(1 / pageScale) 。; DX =(INT)(页%列)* printFormat.getWidth() ( ); DY =(INT)(页%行)* printFormat.getHeight() ( ); g.translate(DX,DY); g.setClip(DX,DY, (int)的(DX + printFormat.getWidth(), ) (int)的(DY + printFormat.getHeight()); ) / /打印的图表上的图形。 第 102 页 JGraph 的用户手册 getGraph() 。漆(克); / /恢复图 g.translate(DX,DY); graph.setScale(oldScale); currentManager.setDoubleBufferingEnabled(TRUE); 返回 PAGE_EXISTS;

}{ 返回 NO_SUCH_PAGE; } } 第 103 页 JGraph 的用户手册 7 布局 7.1 简介 JGraph 的布局 Pro 可以运行在任何支持 Java 运行时环境的系统 版本 1.4 或更高版本。由于 JGraph 的布局 Pro 的 1.2.1 版软件已经包含了 JGraph 的许可证和一个完整的源代码和文档 JGraph 的分布 适当的修订。请注意,JGraph 的布局 Pro 的独立软件和 理解 JGraph 的使用是必需在为了使用 JGraph 的布局的 Pro。 7.2 安装和编译 JGraph 的布局 Pro 的这个版本是专为使用的版本 JGraph 的版本 5.8.3.2,这个版本提供的 JGraph 的布局。 JGraph 的使用与更高版本 应该总是可能的。如果您想了解更多的有关兼容性的信息 特定组合的产品版本,请发送电子邮件至 JGraph 的支持。 7.2.1 要求 ?Java 1.4 或更高版本兼容的虚拟机为您的操作系统。 (1.4.2 推荐。 )的 Java 1.5.x 的已知可以正常工作。 ?编译 JGraph 的布局 Pro 需要 Apache Ant 的,独立于平台的构建工具 使用 Java 命令实现。 7.2.2 安装 JGraph 的布局 Pro 配备一个自解压的 Java 文件。如果 jar 文件关联的。jar 文件设置正确,在一个窗口管理器中打开该文件开始安装。 否则,在命令行中键入: 的 java-jar jgraphlayout-1.3.0.9-src.jar 安装过程就开始了。你将被要求同意许可下 提供该软件,然后选择安装的软件包。 7.2.2.1 项目结构和构建选项 一旦 Java 和 Ant 的安装启动命令提示符窗口或 shell 在* nix 或 Mac 的终端,导航到你的根文件夹 JGraph 的布局 Pro 的安装。 输入 ant 命令,其中命令是在 Ant 构建文件的目标之一, 执行该命令的功能,如下文所述。错过了该命令将 第 104 页 JGraph 的用户手册 建立预设的目标,所有的。 第 105 页 JGraph 的用户手册 SRC /源根 例子/实例根 编译/编译环境 表 1 中。项目的目录结构

清理和生产所有的发行版(默认的目标 ) apidoc 生成的 API 规范(javadoc 中) 建立执行的所有任务完全填充生成目录 清理删除所有生成的文件和目录 编译编译生成树 区产生新鲜的分布 distclean 命令分发文件清理 文档生成的所有文件 初始化,初始化构建 jar 文件构建所有 Java 档案文件(JAR 文件) 编译例子编译的例子 生成生成构建树 例如,运行的主要例子 表 2 中。 Ant 命令选项 例如,编译和运行示例 UI 键入以下内容: 蚂蚁的例子 第 106 页 JGraph 的用户手册 7.3 JGraph 的布局设计专业 7.3.1 什么 jgraph 的布局 PRO 吗? JGraph 的布局 Pro 中使用 JGraph 的库图结构定义和执行 一方或双方的该图形结构的两个特定的功能。 1。该图的顶点的位置,试图达到一定的算法(S) 审美要求, 2。添加和删除控制点,图中的边使用的算法(S) 试图达到一定的审美要求。 正是这些审美标准都依赖于单个应用程序或布局 的要求。一般来说,这些可能涉及到传播顶点均匀,没有他们, 彼此重叠,避免重叠顶点的边和其它边交叉, 聚类连接的顶点的邻居,订购顶点,以反映整体图 的方向发展。 JGraph 的布局 Pro 中的标准门面需要 JGraph 的实例,以便操作。 门面 JGraph 的布局 Pro 中提取信息,从 GraphLayoutCache 和 图模型连接到该曲线图的实例,并将其存储用于处理由布局。 “ 门面然后可以被传递到一个或多个布局和存储内的化合物的结果 迫使要施加的结果返回到图形。 从 JGraph 的布局临 1.3 的新版本的门面,JGraphModelFacade,是 介绍。这个门面并不依赖任何 JGraph 对象,而不是 作为参数的构造函数需要而 GraphModel。这意味着,你可以创建一个图形 和布局,而无需实例化一个 JGraph 的,理想的服务器端 布点。 可能会出现一些混乱,一个布局的作用后 GraphLayoutCache 对象, (即在图形视图的应用程序显示的话) ,或者在过滤视图

由该 JGraphFacade。布局的作用图的正面描述它,这可能是 不同,由高速缓冲存储器提供的视图。 例如,可被设置为不显示边缘 GraphLayoutCache 当他们的 连接的顶点是不可见的。然而,该的门面,通过 edgePromotion 标志, 可能会促进那些边缘的第一个可见的父母。这意味着布局将充当虽然 的边缘,即使是存在的,它不被显示。 7.4 运行布局 有两个重要的类所需的配置和运行布局, JGraphLayout 和 JGraphFacade。类继承自 JGraphLayout 执行 的制造的布局,而中,JGraphFacade 进行的数学运算 过滤的图形,并提供各种实用的布局方法提取 有关下列内容的信息的图。这种机制的优点是,在确切的数据 第 107 页 JGraph 的用户手册 转移到布局的去耦合从布局算法本身,提供了更 稳定的 API 的生命周期内的包作为新的布局进行了介绍。这也意味着 该布局算法是能够使用的输出作为其输入的任何其他布局,即门面 被操纵的一个布局,然后传递到另一个。 布局时,第一件要做的事是创造了门面对象,它存储 信息采取行动,其配置的图形。的构造要求 JGraph 的一个实例,所以门面都知道被引用的图形的布局。 如果树布局正在被使用,也可以通过在构造函数必须根节点(s)的 树木。 JGraphFacade 也具有多个开关,使布局作用于 在图中的正确的细胞。通过设置这些开关,门面配置它返回什么 从一定的实用方法,再在封装配置的布局 门面。例如,默认情况下,getNeighbours()方法的门面回报 邻居细胞,无论自己的知名度,而与 ignoresHiddenCells 标志设置为 true,则仅将返回当前的图形视图中可见的细胞。布局 访问的门面信息,通过这样的方法,进行有状态的 过滤。门面上的开关是: ?ignoresHiddenCells - 存储是否布局上唯一可见的 只作用于细胞即真正的手段可见细胞,对细胞的虚假行为,无论其 的知名度。的默认值是 true。 ?ignoresUnconnectedCells - 商店的布局是否是只 细胞,具有至少一个连接的边缘。 true 表示只作用于细胞连接, 虚假对细胞行为而不管它们的连接。的默认值是 true。 ?ignoresCellsInGroups - 商店的布局是否是只作用于根 在模型中的细胞。真正意味着只有在根细胞,造假手段作用于根 和他们的孩子。默认值是假的。 ?定向 - 商店是否该图是被视为一个有向图。 true 表示按照目标物源方向的边缘,造假手段治疗边 没有方向的。的默认值是 true。 外观对象不仅存储输入的布局,但也输出。的结果 布局的情况下不会自动应用到图形开发者希望检查

导致或执行另一种算法。为了使这样的布局的结果被存储为一个 嵌套的地图的图形单元的关键是每一对的属性,和一个属性 地图,详细介绍了该单元格的布局所做的更改,很值。这张地图可能 通过调用到 getNestedMap()的门面,适用于直接发送 编辑()方法的 GraphLayoutCache 或而 GraphModel。下面是一个简单的 例如,示出的步骤的设置对象,执行布局和应用 布局的图形: JGraphFacade 外观新 JGraphFacade(图); / /通过门面 把 JGraph 实例 JGraphLayout 的布局=的新 JGraphFastOrganicLayout(); / /创建一个 比如适当的布局 layout.run(外观); / /运行的布局的门面。需要注意的是 第 108 页 JGraph 的用户手册 布局没有实现 Runnable 接口,以避免混乱 地图嵌套 facade.createNestedMap(TRUE,TRUE); / /获取地图 从外观的变化所产生的属性 graph.getGraphLayoutCache() 。编辑(嵌套); / /应用的结果 实际的图形 的方法,得到一个嵌套的查询结果的布局的地图,createNestedMap, 有两个参数: ?ignoreGrid - 不论在地图上捕捉到返回当前电网 ?flushOrigin - 不论所产生的图形的边界应该被移动到 (0,0)的 7.4.1 写自己的布局 创建任何新的布局应符合的 JGraphLayout 接口。新布局 复杂的,但主要是由于算法的过程中,接口的布局, 与 JGraph 的是简单的。 任何布局的 run()方法必须确定所需信息的门面 因为它目前存在,执行布局和最终应用的查询结果的布局回 门面。请记住,门面是一个有状态的图形过滤器。总是使用的原因 的门面,而不是图形模式或图形布局缓存,是许多布局 施加顺序和最后一个布局的输出应该输入下一个。另外, 考虑图中的模型或视图的门面标志。 所有布局做的第一件事情之一是获得的位置和大小的顶点为 奠定了出来。这是使用 getBounds()方法的门面。布局通常存储 在布局类本地副本的界限值。一个顶点数组被传递到 getBounds()方法,这是使用 facade.getVertices() 。的 toArray() 。 以及作为定位的顶点,这些顶点之间的连接将通常 是必需的。 getNeighbours()经常被用来确定这一点,也 getEdgesBetween() , getOutgoingEdges()和 getIncomingEdges()是在这方面有用。 最后,经应用的布局 alogrithm,后的顶点的位置的布局 必须是可用的。然后将这些设置的门面,使用定义的 setLocation() 。如果布局 确实是正确的,则调用在上面描述的方式,将导致在布局之中

施加到图形。 7.4.2 边缘控制点 一些布局算法是专为操作和插入/删除 边缘控制点,以提供更好的路由,在最终的结果。由于路由 算法可以被定义布局算法的每一个边缘的基础上,只改变了控制 边缘点是必需由该算法。因此,如果一个算法改变边缘 第 109 页 JGraph 的用户手册 控制点和另一个布局立即控制点 在新的布局可能看起来不正确。而不是试图去猜测是否 插入控制点被有意或意外,这是留给开发人员 处理与国家控制点之前被应用的布局。该实用程序的方法 resetControlPoints()上 JGraphFacade 的是可用来清除所有的控制点 如果您需要做任何运行布局前。 7.4.3 示例 把 JGraph 布局 Pro 产品包的例子,你会发现一系列 示例,演示了布局功能,以及一些额外的功能,如 使用概述面板,导出到 SVG 和实施富文本标签 editiors 的。注意 ,的 JGraphLayoutExample 需要使用外部 L2FProd 的公用库 运行。此库可根据 Apache 软件许可证。 JGraph 的团队有 用了好几年,结果发现该软件是高品质和领先 开发人员是非常敏感的 bug 报告。 第 110 页 JGraph 的用户手册 7.5 使用布局 7.5.1 树布局 把 JGraph 布局 Pro 包目前在树的布局类是: ?com.jgraph.layout.tree.JGraphTreeLayout ?com.jgraph.layout.tree.JGraphCompact TreeLayout ?com.jgraph.tree.JGraphRadialTreeLayout。 需要注意的是至少有一个根,必须指定所有使用根的树布局 的门面构造函数的参数。请注意,这些树的根,根 图模型。树布局将遵循从根节点()的边缘,以确定 树的结构(S) ,考虑到设置的门面。 布局 Pro 还支持的概念,奠定了秀子树的例子 应用程序。节点和执行的任何树布局的选择将导致仅 与选定的节点作为根树子树节点被解雇了。需要注意的是门面 需要将被设置到定向(默认值) ,否则该算法确定树 结构处理子节点的父母。然而,该技术可用于 改变整个目录树的根节点。 下面是如何设置的门面,处理树的布局: 对象根 getRoots(); / /替换 getRoots 用自己的 Object 数组的细胞树根。注意:这些是根细胞(s) 树() ,而不是根的图形模型。

JGraphFacade 门面=的新 JGraphFacade(图,根); / /通过 门面的 JGraph 的实例 JGraphLayout 的布局=的新 JGraphTreeLayout(); / /创建一个 比如适当的布局 layout.run(外观); / /运行的布局的门面。 地图嵌套 facade.createNestedMap(TRUE,TRUE); / /获取地图 从外观的变化所产生的属性 graph.getGraphLayoutCache() 。编辑(嵌套); / /应用的结果 实际的图形 7.5.1.1 树布局 树布局安排的节点,从一个指定的节点(S) ,成树 结构。树方向的四个基本方位点的布局选项 包括的同级节点选择对准,设置之间的最小距离 节点树的相邻水平上和设置上的节点之间的最小距离 相同的水平。树布局的性能是 O(| V |) ,即比例数 在布局中的节点。 第 111 页 JGraph 的用户手册 7.5.1.1.1 对齐 对齐指将对齐的顶点的一部分为一个给定的电平上的所有顶点。 使用 setAlignment()方法中,你可以设置对齐的图形 SwingConstants.TOP,SwingConstants.CENTER SwingConstants.BOTTOM。这些常量的文字值是 1,0 3 分别在写作的时候,变量名应该总是使用。 第 112 页 图 51:SwingConstants.TOP 图 52:SwingConstants.CENTER JGraph 的用户手册 7.5.1.1.2 取向 取向是指在其中的罗盘方向(s)的树的根节点将 位于相对于树的其余部分。使用 setOrientation()方法,你可以设置 的方向,SwingConstants.EAST SwingConstants.NORTH, SwingConstants.SOUTH 或 SwingConstants.WEST。这些文字值 常量是 1,3,5 和 7 在写作的时候,但变量的名字应该永远是 使用。 第 113 页 图 53:SwingConstants.BOTTOM 插图 54: SwingConstants.NORTH JGraph 的用户手册 第 114 页 图 55:SwingConstants.EAST 插图 56: SwingConstants.SOUTH

JGraph 的用户手册 7.5.1.1.3 levelDistance 和 nodeDistance levelDistance 任何顶点的最低点之间的距离是在一个水平上至 的任一顶点的下一个级别的最高点。 nodeDistance 是最小 在同一水平上的任意两个顶点之间的距离。请注意,水平更接近根倾向于 要隔开比这进一步分开,假设节点的密度是朝向低 开始的树。 。 第 115 页 插图 57: SwingConstants.WEST 图 58:levelDistance 和 nodeDistance 定义 JGraph 的用户手册 7.5.1.1.4 combineLevelNodes combineLevelNodes 标志指定与否,以确保上的节点 同一棵树上水平排列在整个树。当节点的大小不同,也能够 节省空间与更小节点的子树,通过设置此标志为 false。然而,这可以 使难以确定视觉哪些节点占据相同的水平上树。如果这 标志设置为 true,定位变量确定到底是哪部分节点的 相同的水平对准。 第 116 页 JGraph 的用户手册 第 117 页 图 59:combineLevelNodes = FALSE 图 60:combineLevelNodes = TRUE JGraph 的用户手册 7.5.1.1.5 positionMultipleTrees 和 treeDistance positionMultipleTrees 判定是否分隔不同的树,以便 在树木间不存在重叠。以被分离的目录树中的每一个将有 指定根的 JGraphFacade 参数。的每一个之间的距离 树的定义由 treeDistance 变量。 第 118 页 插图 61: positionMultipleTrees = 假 JGraph 的用户手册 7.5.1.2 紧凑树布局 紧凑树布局(以前称为摩恩)是另一个树中的家庭布局, 它使一些改进,标准树布局。细胞形态的紧凑树 考虑,并集中在压缩生产的结果可能。紧凑型 树还介绍了机制计算三角洲的布局,使整个计算 没有上要执行的每一个布局。如何做到这一点的确切机制 取决于应用。如果你需要这种性能上的优势,联系 JGraph 的

支持的信息,如何将它应用在你的应用程序。紧凑树管理 压缩比标准的树更紧密的存储子树为多边形。在 性能的时间布局使用布局为 O(| V |) ,即按比例的数目 顶点。 7.5.1.3 径向树布局 第 119 页 图 62:positionMultipleTrees = 真实的,treeDistance = 30 JGraph 的用户手册 径向树布局绘制树的根节点中心的布局奠定 满分的焦点周围节点的同心环中的其他节点。在

相关文章:
Jgraph中文
Jgraph中文_能源/化工_工程科技_专业资料。JGraph 框架应用 !JGraph自动布局JGraph 的用户手册 目录 1 1.1 JGraph 的做什么? 1.2 什么是 1.2.1 图形可视化 ...
的产品,不是太难看(AWT)就是在某些平台有 BUG
Quaqua--一个 Windows 平台下的仿 Mac 的主题包) ,再不就是对中文支持不好...JGraph 的一个作者就表达了对 SWT/JFace/Draw2D 的不满,认为 SWT 在执行效率...
数据结构入门
。只是为了你的程序好看、能理解而已,其实 “ElemType”就是中文的“数据类型”...{ AdjList vertex; int vexnum,arcnum; GraphKind kind; }AdjGraph; 其实是...
业务流程建模
泳道用来组织和分类 活动集 2.2.2 图表中文字,颜色,大小和线的规定建模 者 ...未找到引用源。.1 树与图的区别和联系表 树JTree 继承性 修改性 图JGraph ...
swt
(SWING, Quaqua--一个 Windows 平台下的仿 Mac 的主题包),再不就是对中文...JGraph 的一个作者就表达了对 SWT/JFace/Draw2D 的不满,认为 SWT 在执行效率...
Mantis安装手册
//这是为了解决 jgraph 显示图形中的中文 乱码问题 putenv("TZ=Asia/Shanghai"); //解决 mantis 时区问题,和 jgraph 无关 [2] 修改 mantis 配置文件 config....
JWFDv0.96 工作流引擎数据库结构说明
JGRAPH 开源软件的流程设计器和建 立在图形自定义数据结构基础上面的流程引擎的...(节)顶点标识名,非空,字符型) 功能: 功能 标识流程图节点的名称,中文 或者...
JWFDv0.96 流程XML结构说明
而不需要中文名称 属性名称 LineEnd:这个属性表示这个连接边的图形箭头符号的样式,由 JGRAPH 内部定 义,从 1 号-6 号有 N 种,这里使用的是常规的第四号箭头...
JWFDv0.96 开源工作流引擎设计-数据库结构说明
JGRAPH 开源软件的流程设计器和建 立在图形自定义数据结构基础上面的流程引擎的...(节)顶点标识名,非空,字符型) 功能: 标识流程图节点的名称,中文 或者英文,...
JWFDv0.90 工作流系统使用说明
jbpm4.3中文开发手册 84页 1下载券 jBPM4工作流应用开发指南... 22页 免费 ...(客户端) 开发工具 Borland JBuilder X, Dreamware MX 第三方工具: JGRAPH 的...
更多相关标签:
jgraph 中文手册 | jgraph | jgraph demo | jgraph下载 | jgraph官网 | jgraph.jar | jgraph 网络拓扑 | jgraph collapse |