`
walnut
  • 浏览: 104845 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jGraph简介

    博客分类:
  • java
阅读更多
  Jgraph http://www.jgraph.com/ 是一个开源的,兼容Swing的基于MVC体系结构图形组件,具有以下特点:
1) 完全Swing兼容;
2) 简单、高效的设计;
3) 时间效率高;
4) 100 %纯Java;
jGraph简介

        jGraph具有相当高的交互性和自动化,是一套为图定做的组件。其主要用途是在一些需要表示图结构的应用中,比如流程图、UML、交通线路、网络等等。
        jGraph在本文撰写时版本为5.8.0.0,可以在链接出找到jGraph的主页。
        jGraph主要包括以下一些产品:
   
        JGraph - The Java Open Source Graph Drawing Component    ( 有Open Source )
        JGraph Layout Pro - The Java Graph Layout Solution
        JGraphpad Pro Diagram Editor Framework
        MxGraph Thin Client - JGraph in a browser!
   
        咱们只是学习嘛,当然只用jGraph咯。jGraph Layout Pro是一个对图进行布局的软件,但是目前要收费的,jGraph对图的操作包括:图显示、图交互、图布局、图分析等。

        JGraph 的基本SWING 组件如下:

            org.jgraph Basic            JGraph 类
            org.jgraph.event            Graph 事件模型
            org.jgraph.graph             Graph 结构及结点
            org.jgraph.plaf                 Graph UI 委托组件
            org.jgraph.util                 常用的工具类

        补充一下,与jGraph类似的可用于绘图的还有eclipse的GEF。

jGraph模型

        一张图——JGraph 类 的主要结构:
            JGraph extends JComponent {
                org.jgraph.graph.GraphModel    model; (DefaultGraphModel)
                org.jgraph.plaf.GraphUI            ui; (BasicGraphUI)
                org.jgraph.graph.GraphLayoutCache        cache;
           }

        JGraph 除了SWING的MVC结构,即引用了MODEL和UI外,他还保持着一个奇怪的应用GraphLayoutCache。 GraphLayoutCache 可以被看作是MODEL的一个扩展,它的作用是保证图中各结点的状态以及一些外观等。因为图的复杂性,使用一个GraphLayoutCache 可以用来处理这些复杂问题。
        配置JGraph可以使用一系列的set方法,有许多很有用的功能可以开关。


        图的逻辑结构——GraphModel 类:
            满足MVC的要求,GraphModel保存着所有的图中的对象,它的默认实现DefaultGraphModel能够满足一般的需求。
            GraphModel包含三个基本操作:insert() , edit() , remove() 。这些操作会起到与GraphLayoutCache相同的效果,但与GraphLayoutCache略微不同的是它的参数比较多,乍看下去比较麻烦。 其实GraphModel所要求的只是结点的逻辑结构,对于结点的细节它并不关心。所以可以在初始化图时使用GraphModel,不要常常用它的方法来 对细节做修改,这既不方便,也没必要。
            另外,就是GraphModel提供了许多get方法,可以很方便检索相应的结点。

Cells

        JGraph 的单位(Cells) 有三种:Vertex、 Edge、 Port。
            Vertex 可以携带对象,由于JGraph是只负责表示的,并不真正负责数据的操作。那么在图形和数据间就需要一个使者,这就是Vertex ,Vertex 可以是文字、图形等对象。
            Port 是一般比较陌生的单位,在图的算法中并不设计Port,但在图形表示中它十分有用。如同它的名字,他是Vertex上的一个端口,可以通过端口连接其他Vertex,而在JGraph中Port还可以用于改变Edge的形状等等。
            Edge 与图算法中的边也有一点不同,Edge 是只能连接Port而不是Vertex的。这样,因为多了Port单元,使得Edge更加灵活、更加丰富了。

        默认单元——DefaultCell:
            它是DefaultEdge和DefaultPort的父类,又是DefaultMutableTreeNode的子类,其地位可以相当于Vertex。 一个DefaultCell可以携带一个UserObject。每个DefaultCell还有一个AttributeMap,负责它的属性(颜色、大小 等等)。用一套set方法可以修改AttributeMap。

        边和端口单元——Edge、Port:
            除了继承DefaultCell,Edge、Port还有一些独有的方法。
            Edge有getSource() 和 getTarget() 方法,用以获得边的两端的对象(一般为Port)。还一个路由类,定义了一些路由方法。
            Port 主要任务是承载Edge,所以有一些关于获得Edge的方法。另外,Port还定义了获得锚(比如一个Vertex中包含一个Port)的方法。

        Cell的处理:
            每个Cell包括Cell Object、Cell Renderer、Cell Editor、Cell Handle。其中Renderer负责Cell的表示,包括形状等等。Editor 做Cell的修改用,当双击Cell后则调用Editor来编辑Cell。以上都是类似与JTable 和 JTree的。
            Handle 是SWING的组件中没有的,它的任务是处理Cell的大小与移动。可以重写paint()方法来指定经过鼠标拖动所导致的Cell大小和位置变化。

            对于这些单元的属性的控制,可以仔细看看GraphConstants这个类的set方法,基本上所有的属性都是用这个类的set修改的。
二、JGraph设计
1) MVC
Swing是Java(Sun)提供的UI标准实现之一,Swing基于AWT(Abstract Windowing Toolkit)。JGraph完全兼容Swing,它的实现仍然基于MVC体系结构。
JGraph MVC
View:
JGraph不包含实际的数据,它提供了数据的视;JGraph对象画图的机制是:
将图元定义为一个一个的 cell,每个cell可以是一个顶点(vertex)、边(edge)或者节点(port)中的一种。顶点可以有邻接的顶点,他们通过边相联系,边联接 的两个端点称为目标和源,每个目标或者源是一个节点。节点是顶点的孩子。每个cell都可以有自己的孩子。
每个cell的外观由相应的属性定义,属性序列是指一系列的键-值对,他们以Map形式组织,例如:
Map cellAttrib = new Hashtable();
// Set bounds
Rectangle2D helloBounds = new Rectangle2D.Double(20, 20, 40, 20);
GraphConstants.setBounds(cellAttrib, helloBounds);
// Set black border
GraphConstants.setBorderColor(cellAttrib, Color.black);
一个cell有类似这样一个cellAttrib的Map,来定义其外观。
外观可以指定诸如一条边的箭头样式等属性。
Model:
数据对象可以看成是JGraph中两个独立结构 的链接点:grahp结构和group结构。Graph结构基于图论中的顶点、边定义。Group结构是cell的composition结构。 Graph结构中getSource()和getTarget()方法,获得源和目标节点。而在group中通过getChild(), getParent()来获得cell的组成结构。
2) 低层基于图论逻辑
即:一个图G包含一个非空的元 素集V(G)和一个E(G),其中,E(G)是V(G)中两个无序元素组成的二元组。V(G)称为图G顶点的集合,如果任意集合V(G)中的顶点x/y, (x,y)在E(G)中,边(x,y)可能以连接顶点x和y的边(弧)所代表,X与y就被称为邻接的,否则x与y不邻接。
三、JGraph的应用
以下是一个基于JGraph的Helloworld的分析:
import省略
public class HelloWorld {
public static void main(String[] args) {
// Construct Model and Graph
GraphModel model = new DefaultGraphModel();
JGraph graph = new JGraph(model);
graph.setSelectNewCells(true);
// Create Nested Map (from Cells to Attributes)
// 此Map中记录所有属性,其中的键-值对是cell-cellAttribute
// 每个cellAttribute又是一个Map,其键-值对是具体一个cell的属性-值
Map attributes = new Hashtable();
// 以下建立两个顶点(cell)Hello和World,并分别设置他们的属性Map
// Create Hello Vertex
DefaultGraphCell hello = new DefaultGraphCell("Hello");
// Create Hello Vertex Attributes
Map helloAttrib = new Hashtable();
attributes.put(hello, helloAttrib);
// Set bounds
Rectangle2D helloBounds = new Rectangle2D.Double(20, 20, 40, 20);
GraphConstants.setBounds(helloAttrib, helloBounds);
// Set black border
GraphConstants.setBorderColor(helloAttrib, Color.black);
// Add a Port
// 每个顶点为了与其他顶点相邻接,必须添加节点(cell)
DefaultPort hp = new DefaultPort();
hello.add(hp);
// Create World Vertex
DefaultGraphCell world = new DefaultGraphCell("World");
// Create World Vertex Attributes
Map worldAttrib = new Hashtable();
attributes.put(world, worldAttrib);
// Set bounds
Rectangle2D worldBounds = new Rectangle2D.Double(140, 140, 40, 20);
GraphConstants.setBounds(worldAttrib , worldBounds);
// Set fill color
GraphConstants.setBackground(worldAttrib, Color.orange);
GraphConstants.setOpaque(worldAttrib, true);
// Set raised border
GraphConstants.setBorder(worldAttrib, 
BorderFactory.createRaisedBevelBorder());
// Add a Port
DefaultPort wp = new DefaultPort();
world.add(wp);
// 建立联接两个顶点的边
// Create Edge
DefaultEdge edge = new DefaultEdge();
// Create Edge Attributes
Map edgeAttrib = new Hashtable();
attributes.put(edge, edgeAttrib);
// Set Arrow
int arrow = GraphConstants.ARROW_CLASSIC;
GraphConstants.setLineEnd(edgeAttrib , arrow);
GraphConstants.setEndFill(edgeAttrib, true);
// Connect Edge
// 边的两个端点就是两个顶点的child节点(port)
ConnectionSet cs = new ConnectionSet(edge, hp, wp);
Object[] cells = new Object[]{edge, hello, world};
// Insert into Model
// model构件完成
model.insert(cells, attributes, cs, null, null);
// Show in Frame
JFrame frame = new JFrame();
frame.getContentPane().add(new JScrollPane(graph));
//frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
分享到:
评论
1 楼 lth009 2008-12-19  
请问jgraph怎么应用呀。
下载了zip或jar
怎么打开设计界面来设计呀。

相关推荐

    JGraph document

    **一、JGraph简介** JGraph是一款强大的Java图形库,它为开发人员提供了创建和编辑交互式图表的工具。这个库特别适合在应用程序中实现流程图、组织结构图、网络拓扑图等各种图形界面的需求。JGraph以其直观的API、...

    jgraph官方手册

    - **jgraph简介**:jgraph是一款专为Java开发者设计的高级图形组件库,主要用于实现复杂的图表绘制功能。它不仅支持各种基本图形的绘制,还具备强大的交互性和自定义能力。 - **官方手册定位**:本手册作为jgraph的...

    Jgraph英文文档

    ### 一、JGraph简介 JGraph 是一款专为 Java 开发者设计的图形编辑器组件库,它提供了丰富的功能来帮助开发者创建复杂的图形界面应用。JGraph 主要用于创建、编辑、布局以及分析图形数据。该组件库支持多种图形数据...

    JGraph

    #### 一、简介 **JGraph**是一款用于创建、编辑和显示图表的高性能、轻量级Java库。它不仅提供了丰富的API来实现复杂的图表绘制,还支持多种布局算法和数据分析功能,使得开发者能够轻松地在Java应用程序中集成高级...

    jgraph5&jgraphx

    **JGraph5简介** JGraph5是一个基于Swing的图形组件库,它为Java开发者提供了在应用程序中绘制和操作图形节点和边的工具。这个库特别适合那些需要构建流程图、组织结构图或状态机等图形界面的应用。JGraph5提供了...

    基于MVC模型的swing图形组件的设计

    #### MVC设计模式简介 MVC设计模式是一种广泛应用于软件工程的架构模式,它将应用程序分为三个核心组成部分:模型(Model)、视图(View)和控制器(Controller)。这种分离使得程序更加模块化、易于维护和扩展。 - **...

    drawio桌面版流程图绘制工具64位.rar

    一、Drawio简介 Drawio是一款开源的、跨平台的流程图绘制软件,支持Windows、MacOS和Linux操作系统。它提供了一个直观易用的界面,让用户无需编程基础就能轻松创建各种图表,如流程图、UML图、网络图、组织结构图等...

    JGrapht包简介

    `java.util`提供了集合框架和其他实用工具类,而`JGraph`是一个纯Java的图形组件,支持拖放、缩放等功能,可以嵌入到Swing应用程序中。`java.awt`则包含了创建用户界面和图形图像所需的类。 JGrapht的核心接口是`...

    JS页面动态绘图工具SVG,Canvas,VML介简介

    说到绘图、报表之类的技术,大家首先想到的就是Flex,当然也有许多...比如说maxGraph,你可以到http://www.jgraph.com/mxgraph.html上去看一下效果。 如果你已经在网络上看了一会了我们可以继续来聊一下Web中JS绘图的内

    jbpm学习资料

    ### 一、JBPM简介 JBPM是“Java Business Process Model”的缩写,它是一个开源的工作流管理系统,用于定义、执行业务流程。JBPM支持BPMN 2.0标准,并提供了灵活的方式来定义业务逻辑。它被广泛应用于各种类型的...

    JGraphT:一个免费的Java类库-开源

    **JGraphT简介** JGraphT是一个强大的Java类库,专为实现数学图形理论中的对象和算法而设计。它提供了一套全面的工具,用于创建、操作和分析图结构。作为一个开源项目,JGraphT遵循Apache 2.0许可证,允许用户自由...

    JAVA上百实例源码以及开源项目源代码

    简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!...

Global site tag (gtag.js) - Google Analytics