由于项目中要用到流程图来展示数据之间的链关系,于是决定用开源的jgraph来做,并将图形嵌入到b/s结构的项目中,所以用到了applet来将jgraph流程图显示在网页。由于之前没有接触过jgraph和 applet,不得不边查资料边琢磨着做,做的比较粗糙但也达到了预期效果,现将学习心得和所遇问题总结一下,仅供借鉴。
1. Jgraph简介
Jgraph是一个开源的,兼容Swing的图形组件,具有相当高的交互性和自动化,是一套为图定做的组件。其主要用途是在一些需要表示图结构的应用中,比如流程图、UML、交通线路、网络等等。
Jgraph常用类说明
org.jgraph.graph.GraphModel :默认实现类为DefaultGraphModel,能满足一般需求,一张图(或一个jgraph类)中必不可少的一个成员变量,好比是一个图的画布,先准备好画布,才能在画布上添各种色彩;
org.jgraph.graph.DefaultGraphCell(Vertex):可以携带对象,由于JGraph是只负责表示的,并不真正负责数据的操作。那么在图形和数据间就需要一个使者,这就是Vertex ,Vertex 可以是文字、图形等对象。
org.jgraph.graph.DefaultPort(Port):Port 是一般比较陌生的单位,在图的算法中并不设计Port,但在图形表示中它十分有用。他是Vertex上的一个端口,可以通过端口连接其他Vertex,而在JGraph中Port还可以用于改变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)Hello和World,并分别设置他们的属性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);
}
相关推荐
在集成JGraph到项目时,需要考虑项目的结构和构建选项。通常情况下,将JGraph库添加到项目的类路径(Classpath)中即可使用。 #### 六、JGraph的设计理念 JGraph的设计充分考虑了灵活性和扩展性,这使得它不仅能作为...
7. **集成到其他Java应用**:由于JGraph是基于Java的,它可以无缝集成到任何Java应用程序中,包括Swing和JavaFX等桌面应用,甚至可以在Web应用中通过Java Applet或Java Web Start技术使用。 8. **社区支持**:...
1. **安装与设置**:介绍如何将JGraph库添加到Java项目中,以及相关的依赖管理和构建工具配置。 2. **基本图形元素**:详细讲解了JGraph中的节点(Vertices)和边(Edges),包括它们的创建、属性设置和可视化定制...
在iteye博客中,作者liujianeye分享了关于如何利用jgraph进行图形绘制和交互实现的一些实践经验和技巧。 **知识点详解:** 1. **jgraph库介绍:** jgraph是开源的JavaScript库,主要用于创建复杂的图形用户界面,...
1. **初始化和配置**:创建JGraph实例并设置基本属性,如背景色、绘图区域大小等。可以通过`GraphModel`来管理图形节点和边的数据。 2. **创建图形元素**:使用`Cell`类作为基本的图形单元,可以创建节点(`Vertex`...
- **项目结构与构建选项**:jgraph项目通常包含几个关键文件夹和配置文件,用于管理源代码和构建过程。 - **1.6 设计理念** - **模块化设计**:jgraph采用了高度模块化的设计思路,便于用户根据实际需求定制功能...
在使用JGraph时,你需要将JGraph的jar包(如`mxgraph.jar`)添加到你的项目类路径中,以便能够访问其类和方法。这可以通过IDE的设置或者在构建脚本中指定。 4. **源码学习:** 查看源码是深入理解JGraph工作原理的...
源代码的形式使得开发者可以直接编译和理解其内部工作原理,从而更好地整合到自己的项目中。 总的来说,JGraph是一个强大的工具,适用于需要图形化展示数据或者创建交互式图形界面的Java应用。通过其开源的特性,...
1. **安装与导入**:首先,你需要下载JGraph库并将其添加到项目依赖中。在Java项目中,这通常通过Maven或Gradle的依赖管理来完成。 2. **创建基本图形**:教程将引导你创建基本的顶点和边。这涉及到实例化`...
- **导入JGraph库**:将下载的jar包加入到项目类路径中,确保能够访问到JGraph的相关类。 - **创建图形模型**:通过`GraphModel`接口实例化一个模型,它是图表数据结构的基础。 - **构建图形视图**:使用`JGraph`类...
1. **图形编辑器组件**:JGraph的核心是一个高度可定制的图形编辑器组件,该组件可以嵌入到任何Java Swing应用程序中。它支持拖放操作、图形元素的移动、缩放、旋转等基本操作。 2. **图形元素与属性**:每个图形...
- **6.3 项目结构**:文档还提到了jgraph项目的典型结构,包括依赖管理和构建选项等细节,这对于构建大型项目尤为重要。 - **6.4 设计模式**:jgraph内部采用了一些设计模式来提高代码的可维护性和扩展性,这些模式...
1. **集成到项目**: 将JGRAPH的jar文件引入到Java项目中,通常通过Maven或Gradle等构建工具进行依赖管理。 2. **创建图形**: 使用`Graph`类初始化一个图形对象,然后添加节点和边。节点和边可以通过`Vertex`和`Edge...
- **全Swing兼容性**:确保JGraph可以无缝集成到任何基于Swing的应用程序中。 - **清晰高效的设计**:设计简洁明了,同时保证高效的性能表现。 - **短下载时间**:通过优化代码结构,减少应用程序启动所需的加载时间...
1. **图形可视化**:JGraph 提供了丰富的图形组件,可以创建各种形状和连接线来展示数据结构。 2. **图表互动**:用户可以通过鼠标和键盘与图表进行交互,如拖动、缩放、选择和编辑元素。 3. **图表布局**:内置多种...
**jgraph-draw.io** 是一个在线的图形编辑工具,专用于创建和编辑流程图。它基于 **jGraph** 技术,提供了一个用户友好的Web界面,使得非技术人员也能轻松绘制各种流程、图表和组织结构。这个工具的灵活性和易用性使...
JGraph 是一款强大的图形库,主要用于创建流程图和其他类型的图形可视化应用。它为开发者提供了丰富的功能,包括图形的创建、编辑、布局以及交互性。在本文中,我们将深入探讨 JGraph 的核心概念、使用方法以及如何...
jgraph画图实现代码,适合初学者,很多功能jgraph画图实现代码,适合初学者,很多功能jgraph画图实现代码,适合初学者,很多功能jgraph画图实现代码,适合初学者,很多功能jgraph画图实现代码,适合初学者,很多功能...
JGraph组件下载 JGraph.jar组件下载 javabean组件下载 图像绘制javabean