`
justhavealittlefaith
  • 浏览: 8991 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

关于项目中用到jgraph和applet的一点总结(1)

阅读更多

由于项目中要用到流程图来展示数据之间的链关系,于是决定用开源的jgraph来做,并将图形嵌入到b/s结构的项目中,所以用到了applet来将jgraph流程图显示在网页。由于之前没有接触过jgraph和 applet,不得不边查资料边琢磨着做,做的比较粗糙但也达到了预期效果,现将学习心得和所遇问题总结一下,仅供借鉴。

 

 

1. Jgraph简介

 

Jgraph是一个开源的,兼容Swing的图形组件,具有相当高的交互性和自动化,是一套为图定做的组件。其主要用途是在一些需要表示图结构的应用中,比如流程图、UML、交通线路、网络等等。

 

Jgraph常用类说明

org.jgraph.graph.GraphModel :默认实现类为DefaultGraphModel,能满足一般需求,一张图(或一个jgraph)中必不可少的一个成员变量,好比是一个图的画布,先准备好画布,才能在画布上添各种色彩;

org.jgraph.graph.DefaultGraphCellVertex):可以携带对象,由于JGraph是只负责表示的,并不真正负责数据的操作。那么在图形和数据间就需要一个使者,这就是Vertex Vertex 可以是文字、图形等对象。

org.jgraph.graph.DefaultPort(Port)Port 是一般比较陌生的单位,在图的算法中并不设计Port,但在图形表示中它十分有用。他是Vertex上的一个端口,可以通过端口连接其他Vertex,而在JGraphPort还可以用于改变Edge的形状等等。

org.jgraph.graph.DefaultEdge(Edge)Edge 是只能连接Port而不是Vertex

org.jgraph.graph.GraphConstants:可以对所有单元属性的值进行修改,一个jgraph常用工具类。

 

一个简单的例子:

package jgraph;

 

import java.awt.Color;

import java.awt.geom.Rectangle2D;

import java.util.*;

import javax.swing.*;

import org.jgraph.*;

import org.jgraph.graph.*;

 

public class Demo {

 

public static void main(String[] args) {

// Construct Model and Graph   

GraphModel model = new DefaultGraphModel();   

JGraph graph = new JGraph(model);   

graph.setSelectionEnabled(true);   

// Create Nested Map (from Cells to Attributes)   

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

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

Map attributes = new Hashtable();   

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

// Create Hello Vertex   

DefaultGraphCell hello = new DefaultGraphCell("北京");   

// 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("石家庄");   

// 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);   

}

 

}

 

 

2. 关于页面自动布局的问题

 

jgraph图里的单元通过赋予相应的坐标来达到布局的布局的效果,但当单元节点多并加上各种关联之后,手动布局就会相当繁琐,这时候就需要通过一定算法的自动布局来达到效果。

下面是网上一段自动布局结合项目后修改的例子:

package test;

public class TestGraph extends Applet implements MouseListener{

public Map gefNodeMap = null;

public Map graphNodeMap = null;

public List edgeList = null;

DirectedGraph directedGraph = null;

JGraph graph = null;

URLConnection connect;

List tempList;

 

public TestGraph() {

 

}

 

public void init() {

String hh = this.getParameter("hh", "04020200");

String khdm = this.getParameter("khdm", "040290000001697");

List edgeBeanList = this.send(hh, khdm, null);

tempList = edgeBeanList;

 

try {

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

} catch (Exception e) {

e.printStackTrace();

}

graphInit();

 

paintGraph(edgeBeanList);

 

}

 

public String getParameter(String key, String def) {

return getParameter(key) != null ? getParameter(key) : def;

}

 

private void paintGraph(List edgeBeanList) {

try {

gefNodeMap = new HashMap();

graphNodeMap = new HashMap();

edgeList = new ArrayList();

directedGraph = new DirectedGraph();

GraphModel model = new DefaultGraphModel();

graph.setModel(model);

Map attributes = new Hashtable();

Map edgeAttrib = new Hashtable();

GraphConstants.setLineEnd(edgeAttrib, GraphConstants.ARROW_CLASSIC);

GraphConstants.setEndFill(edgeAttrib, true);

graph.setJumpToDefaultPort(true);

 

Iterator edgeBeanIt = edgeBeanList.iterator();

while (edgeBeanIt.hasNext()) {

EdgeBean edgeBean = (EdgeBean) edgeBeanIt.next();

NodeBean sourceAction = edgeBean.getsourceNodeBean();

NodeBean targetAction = edgeBean.gettargetNodeBean();

addEdge(sourceAction, targetAction, 20, edgeBean.getEdgeDesc());

}

 

try {

new DirectedGraphLayout().visit(directedGraph);

} catch (Exception e1) {

new NodeJoiningDirectedGraphLayout().visit(directedGraph);

}

 

Collection nodeCollection = graphNodeMap.values();

if (nodeCollection != null) {

Iterator nodeIterator = nodeCollection.iterator();

if (nodeIterator != null) {

while (nodeIterator.hasNext()) {

DefaultGraphCell node = (DefaultGraphCell) nodeIterator

.next();

NodeBean userObject = (NodeBean) node.getUserObject();

if (userObject == null) {

continue;

}

Node gefNode = (Node) gefNodeMap.get(userObject);

Map nodeAttrib = new Hashtable();

Color c = Color.green;

if (userObject.getType().equals("1")) {

c = new Color(240, 176, 176);

} else if (userObject.getType().equals("2")) {

c = new Color(254, 232, 95);

} else {

c = new Color(127, 191, 81);

}

GraphConstants.setBackground(nodeAttrib, c);

GraphConstants.setOpaque(nodeAttrib, true);

GraphConstants.setBorder(nodeAttrib, BorderFactory

.createRaisedBevelBorder());

GraphConstants.setBorderColor(nodeAttrib, c);

Rectangle2D Bounds = new Rectangle2D.Double(gefNode.x,

gefNode.y, GraphProp.NODE_WIDTH,

GraphProp.NODE_HEIGHT);

GraphConstants.setBounds(nodeAttrib, Bounds);

attributes.put(node, nodeAttrib);

}// while

}

}

 

if (edgeList == null) {

return;

}

for (int i = 0; i < edgeList.size(); i++) {

UnionEdge unionEdge = (UnionEdge) edgeList.get(i);

if (unionEdge == null) {

continue;

}

ConnectionSet cs = new ConnectionSet(unionEdge.getEdge(),

unionEdge.getSourceNode().getChildAt(0), unionEdge

.getTargetNode().getChildAt(0));

Object[] cells = new Object[] { unionEdge.getEdge(),

unionEdge.getSourceNode(), unionEdge.getTargetNode() };

attributes.put(unionEdge.getEdge(), edgeAttrib);

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

}

 

this.labelIntroduce(model, attributes);

 

graph.repaint();

 

} catch (Exception e) {

e.printStackTrace();

}

}

 

private void graphInit() {

 

GraphModel model = new DefaultGraphModel();

graph = new JGraph(model);

graph.setSelectionEnabled(true);

 

graph.addMouseListener(this);

 

JPanel panel = new JPanel();

 

panel.setPreferredSize(new Dimension(550, 430));

panel.setLayout(new BorderLayout());

panel.add(new JScrollPane(graph), BorderLayout.CENTER);

 

this.add(panel);

}

 

0
0
分享到:
评论
2 楼 jiang_xiaohan 2012-09-25  
呃。。。。。例子还没集成到html呀,怎么集成的啊,applet怎么调用jar包的呢,还在学习中,求解释,有完整源码最好,呵呵
1 楼 jun19910822 2011-09-13  
你好,这上面下载的例子不全耶 很多错误  能不能发个完整点的  谢谢

相关推荐

    JGraph

    在集成JGraph到项目时,需要考虑项目的结构和构建选项。通常情况下,将JGraph库添加到项目的类路径(Classpath)中即可使用。 #### 六、JGraph的设计理念 JGraph的设计充分考虑了灵活性和扩展性,这使得它不仅能作为...

    jgraph源码+例子

    7. **集成到其他Java应用**:由于JGraph是基于Java的,它可以无缝集成到任何Java应用程序中,包括Swing和JavaFX等桌面应用,甚至可以在Web应用中通过Java Applet或Java Web Start技术使用。 8. **社区支持**:...

    JGraph 手册+The JGraph Tutorial

    1. **安装与设置**:介绍如何将JGraph库添加到Java项目中,以及相关的依赖管理和构建工具配置。 2. **基本图形元素**:详细讲解了JGraph中的节点(Vertices)和边(Edges),包括它们的创建、属性设置和可视化定制...

    jgraph

    在iteye博客中,作者liujianeye分享了关于如何利用jgraph进行图形绘制和交互实现的一些实践经验和技巧。 **知识点详解:** 1. **jgraph库介绍:** jgraph是开源的JavaScript库,主要用于创建复杂的图形用户界面,...

    JGraph document

    1. **初始化和配置**:创建JGraph实例并设置基本属性,如背景色、绘图区域大小等。可以通过`GraphModel`来管理图形节点和边的数据。 2. **创建图形元素**:使用`Cell`类作为基本的图形单元,可以创建节点(`Vertex`...

    jgraph官方手册

    - **项目结构与构建选项**:jgraph项目通常包含几个关键文件夹和配置文件,用于管理源代码和构建过程。 - **1.6 设计理念** - **模块化设计**:jgraph采用了高度模块化的设计思路,便于用户根据实际需求定制功能...

    JGraph小列子加jar包

    在使用JGraph时,你需要将JGraph的jar包(如`mxgraph.jar`)添加到你的项目类路径中,以便能够访问其类和方法。这可以通过IDE的设置或者在构建脚本中指定。 4. **源码学习:** 查看源码是深入理解JGraph工作原理的...

    jgraph源代码

    源代码的形式使得开发者可以直接编译和理解其内部工作原理,从而更好地整合到自己的项目中。 总的来说,JGraph是一个强大的工具,适用于需要图形化展示数据或者创建交互式图形界面的Java应用。通过其开源的特性,...

    JGraph的开始

    1. **安装与导入**:首先,你需要下载JGraph库并将其添加到项目依赖中。在Java项目中,这通常通过Maven或Gradle的依赖管理来完成。 2. **创建基本图形**:教程将引导你创建基本的顶点和边。这涉及到实例化`...

    jgraph的jar包 zip 源代码

    - **导入JGraph库**:将下载的jar包加入到项目类路径中,确保能够访问到JGraph的相关类。 - **创建图形模型**:通过`GraphModel`接口实例化一个模型,它是图表数据结构的基础。 - **构建图形视图**:使用`JGraph`类...

    JGraph文档和demo

    1. **图形编辑器组件**:JGraph的核心是一个高度可定制的图形编辑器组件,该组件可以嵌入到任何Java Swing应用程序中。它支持拖放操作、图形元素的移动、缩放、旋转等基本操作。 2. **图形元素与属性**:每个图形...

    jgraph官方文档

    - **6.3 项目结构**:文档还提到了jgraph项目的典型结构,包括依赖管理和构建选项等细节,这对于构建大型项目尤为重要。 - **6.4 设计模式**:jgraph内部采用了一些设计模式来提高代码的可维护性和扩展性,这些模式...

    JGRAPH开发jar

    1. **集成到项目**: 将JGRAPH的jar文件引入到Java项目中,通常通过Maven或Gradle等构建工具进行依赖管理。 2. **创建图形**: 使用`Graph`类初始化一个图形对象,然后添加节点和边。节点和边可以通过`Vertex`和`Edge...

    Swing 实现 JGraph

    - **全Swing兼容性**:确保JGraph可以无缝集成到任何基于Swing的应用程序中。 - **清晰高效的设计**:设计简洁明了,同时保证高效的性能表现。 - **短下载时间**:通过优化代码结构,减少应用程序启动所需的加载时间...

    Jgraph中文讲义

    1. **图形可视化**:JGraph 提供了丰富的图形组件,可以创建各种形状和连接线来展示数据结构。 2. **图表互动**:用户可以通过鼠标和键盘与图表进行交互,如拖动、缩放、选择和编辑元素。 3. **图表布局**:内置多种...

    jgraph-draw.io

    **jgraph-draw.io** 是一个在线的图形编辑工具,专用于创建和编辑流程图。它基于 **jGraph** 技术,提供了一个用户友好的Web界面,使得非技术人员也能轻松绘制各种流程、图表和组织结构。这个工具的灵活性和易用性使...

    JGraph中文资料

    JGraph 是一款强大的图形库,主要用于创建流程图和其他类型的图形可视化应用。它为开发者提供了丰富的功能,包括图形的创建、编辑、布局以及交互性。在本文中,我们将深入探讨 JGraph 的核心概念、使用方法以及如何...

    JGraph代码,适合初学者

    jgraph画图实现代码,适合初学者,很多功能jgraph画图实现代码,适合初学者,很多功能jgraph画图实现代码,适合初学者,很多功能jgraph画图实现代码,适合初学者,很多功能jgraph画图实现代码,适合初学者,很多功能...

    JGraph组件下载 JGraph.jar组件下载

    JGraph组件下载 JGraph.jar组件下载 javabean组件下载 图像绘制javabean

Global site tag (gtag.js) - Google Analytics