Draw2d可以通过图形和连线表示图的关系,本节将用实例介绍如何通过图形和连线绘制UML的关系图
表关系实例中药包苦熬表和列的UML图形(Figure),其中表和列又包含属性和方法子图形。
表和列之间要建立一个以对多的关系连线
package com.heming.table.editor.figure;
import org.eclipse.draw2d.AbstractBorder;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.ToolbarLayout;
import org.eclipse.draw2d.geometry.Insets;
/**
* 方法和属性的图形
*
* @author 何明
*
*/
public class CompartmentFigure extends Figure {
public CompartmentFigure() {
ToolbarLayout layout = new ToolbarLayout();
layout.setMinorAlignment(ToolbarLayout.ALIGN_TOPLEFT);
layout.setStretchMinorAxis(false);
// 设置子图形的间距
layout.setSpacing(2);
// 设置布局管理器
setLayoutManager(layout);
// 设置图形的边框
setBorder(new CompartmentFigureBorder());
}
// 图形的边框类
public class CompartmentFigureBorder extends AbstractBorder {
public Insets getInsets(IFigure figure) {
return new Insets(1, 0, 0, 0);
}
// 重画图形的边框
public void paint(IFigure figure, Graphics graphics, Insets insets) {
graphics.drawLine(getPaintRectangle(figure, insets).getTopLeft(),
tempRect.getTopRight());
}
}
}
package com.heming.table.editor.figure;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.LineBorder;
import org.eclipse.draw2d.ToolbarLayout;
import org.eclipse.swt.graphics.Color;
/**
* UMLClassFigure是UML Class的图形,每个UMLClassFigure包含两个CompartmentFigure
* @author 何明
*
*/
public class UMLClassFigure extends Figure {
public static Color classColor = new Color(null,255,255,206);
//属性图形
private CompartmentFigure attributeFigure = new CompartmentFigure();
//子方法图形
private CompartmentFigure methodFigure = new CompartmentFigure();
public UMLClassFigure(Label name){
ToolbarLayout layout = new ToolbarLayout();
//设置布局管理器
setLayoutManager(layout);
//设置图形的边框
setBorder(new LineBorder(ColorConstants.black,1));
//设置背景色
setBackgroundColor(classColor);
//设置图形是否透明
setOpaque(true);
//添加名字的标签
add(name);
//添加属性的图形
add(attributeFigure);
//添加方法的图形
add(methodFigure);
}
/**
* 得到属性图形
* @return
*/
public CompartmentFigure getAttributesCompartment(){
return attributeFigure;
}
/**
* 得到子方法图形
* @return
*/
public CompartmentFigure getMethodsCompartment(){
return methodFigure;
}
}
package com.heming.table.editor.figure;
import org.eclipse.draw2d.ChopboxAnchor;
import org.eclipse.draw2d.ConnectionEndpointLocator;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.LightweightSystem;
import org.eclipse.draw2d.PolygonDecoration;
import org.eclipse.draw2d.PolylineConnection;
import org.eclipse.draw2d.XYLayout;
import org.eclipse.draw2d.geometry.PointList;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
/**
* 连线及测试类
*
* @author 何明
*
*/
public class UMLClassFigureTest {
public static void main(String args[]) {
Display d = new Display();
final Shell shell = new Shell(d);
shell.setSize(400, 400);
shell.setText("UMLClassFigure Test");
LightweightSystem lws = new LightweightSystem(shell);
// 新建底层的图形
Figure contents = new Figure();
// 新建底层图的布局方式为XYLaout
XYLayout contentsLayout = new XYLayout();
contents.setLayoutManager(contentsLayout);
Font classFont = new Font(null, "Arial", 12, SWT.BOLD);
// 添加表的现实文本及显示的图标
Label classLabel1 = new Label("Table", new Image(d,
UMLClassFigureTest.class.getResourceAsStream("class_obj.gif")));
classLabel1.setFont(classFont);
Label classLabel2 = new Label("Column", new Image(d,
UMLClassFigureTest.class.getResourceAsStream("class_obj.gif")));
classLabel2.setFont(classFont);
// 新建表和列的图形
final UMLClassFigure classFigure = new UMLClassFigure(classLabel1);
final UMLClassFigure classFigure2 = new UMLClassFigure(classLabel2);
// 添加属性的显示文本及显示图标
Label attribute1 = new Label("columns:Column[]", new Image(d,
UMLClassFigure.class
.getResourceAsStream("field_private_obj.gif")));
Label attribute2 = new Label("rows:Row[]", new Image(d,
UMLClassFigure.class
.getResourceAsStream("field_private_obj.gif")));
Label attribute3 = new Label("columnID:int", new Image(d,
UMLClassFigure.class
.getResourceAsStream("field_private_obj.gif")));
Label attribute4 = new Label("items:List", new Image(d,
UMLClassFigure.class
.getResourceAsStream("field_private_obj.gif")));
// 添加方法和属性的标签
classFigure.getAttributesCompartment().add(attribute1);
classFigure.getAttributesCompartment().add(attribute2);
classFigure2.getAttributesCompartment().add(attribute3);
classFigure2.getAttributesCompartment().add(attribute4);
Label method1 = new Label("getColumns():Column[]", new Image(d,
UMLClassFigure.class.getResourceAsStream("methpub_obj.gif")));
Label method2 = new Label("getRows:Row[]", new Image(d,
UMLClassFigure.class.getResourceAsStream("methpub_obj.gif")));
Label method3 = new Label("getColumnID():int", new Image(d,
UMLClassFigure.class.getResourceAsStream("methpub_obj.gif")));
Label method4 = new Label("getItems():List]", new Image(d,
UMLClassFigure.class.getResourceAsStream("methpub_obj.gif")));
classFigure.getMethodsCompartment().add(method1);
classFigure.getMethodsCompartment().add(method2);
classFigure2.getMethodsCompartment().add(method3);
classFigure2.getMethodsCompartment().add(method4);
contentsLayout
.setConstraint(classFigure, new Rectangle(10, 10, -1, -1));
contentsLayout.setConstraint(classFigure2, new Rectangle(200, 200, -1,
-1));
// 新建连线
PolylineConnection c = new PolylineConnection();
// 添加图形的锚点
ChopboxAnchor sourceAnchor = new ChopboxAnchor(classFigure);
ChopboxAnchor targetAnchor = new ChopboxAnchor(classFigure2);
c.setSourceAnchor(sourceAnchor);
c.setTargetAnchor(targetAnchor);
// 添加连线的装饰器
PolygonDecoration decoration = new PolygonDecoration();
PointList decorationPointList = new PointList();
decorationPointList.addPoint(0, 0);
decorationPointList.addPoint(-2, 2);
decorationPointList.addPoint(-4, 0);
decorationPointList.addPoint(-2, -2);
decoration.setTemplate(decorationPointList);
c.setSourceDecoration(decoration);
// 添加连线的Locator
ConnectionEndpointLocator targetEndpointLocator = new ConnectionEndpointLocator(
c, true);
targetEndpointLocator.setVDistance(15);
Label targetMultiplicityLabel = new Label("1..*");
c.add(targetMultiplicityLabel, targetEndpointLocator);
// 添加连线到Locator
ConnectionEndpointLocator sourceEndpointLocator = new ConnectionEndpointLocator(
c, false);
sourceEndpointLocator.setVDistance(15);
Label sourceMultiplicityLabel = new Label("1");
c.add(sourceMultiplicityLabel, sourceEndpointLocator);
// 添加连线到Locator
ConnectionEndpointLocator relationshipLocator = new ConnectionEndpointLocator(
c, true);
relationshipLocator.setVDistance(10);
relationshipLocator.setVDistance(-20);
Label relationshipLabel = new Label("contains");
c.add(relationshipLabel, relationshipLocator);
// 把表、列和连线(即关系)添加到底层图形上
contents.add(classFigure);
contents.add(classFigure2);
contents.add(c);
lws.setContents(contents);
shell.open();
while (!shell.isDisposed())
while (!d.readAndDispatch())
d.sleep();
}
}
分享到:
相关推荐
Draw2D UML Diagram是一个用于创建UML类图的工具,通过源码驱动,能够帮助开发者高效地绘制出清晰、准确的类图,便于团队沟通和代码实现。本文将深入探讨Draw2D UML Diagram的使用,以及与其相关的源码解析。 首先...
eclipse draw2d实例大全 org.eclipse.draw2d.examples.cg org.eclipse.draw2d.examples.connections org.eclipse.draw2d.examples.graph ...org.eclipse.draw2d.examples.uml org.eclipse.draw2d.examples.zoom
**GEF/Draw2D入门教程** GEF(Graphical Editing Framework)和Draw2D是Eclipse项目中的两个核心组件,主要用于构建图形用户界面(GUI)特别是图形编辑工具。它们为开发者提供了强大的图形绘制和交互功能,使得创建...
4. **使用流程**:开发者通常会首先定义UML元素的模型类,然后使用Draw2D创建对应的视图,通过GEF实现元素的交互逻辑。在运行时,用户可以通过鼠标操作在界面上添加、修改和删除元素,所有的变更都会反映在模型上。 ...
在IT领域,特别是图形用户界面(GUI)的开发中,Draw2D和GEF(Graphics Editing Framework)是两个重要的开源库,主要用于构建可定制的、交互式的2D图形编辑工具。下面将详细介绍这两个库以及如何在实际项目中使用...
3. **事件处理**:Draw2d.js支持图形对象的点击、拖动等事件监听,使得开发人员可以轻松地实现图形的交互逻辑。 4. **布局算法**:内置的布局算法能够自动排列图形,例如树形布局、网格布局等,使得复杂图表的组织...
在Java编程中,Draw2D库是一个强大的工具,它允许开发者使用SWT(Standard Widget Toolkit)来创建复杂的图形用户界面,特别适用于绘制图形和图表。Draw2D是Eclipse项目的一部分,它提供了一套丰富的API,可以方便地...
- **图形对象**:draw2d提供了一系列预定义的图形对象,如矩形、圆形、多边形等,同时支持自定义形状。 - **连接线**:可以创建和编辑复杂的连接线,支持箭头、曲线等样式,用于表示关系或流程。 - **事件处理**...
网上的Draw2D的参考资料实在是太少了,对于新手来说太不友好了,所以,我总结了一份只有10来页的PPT做为新手的快速入门教程。
Draw2d是一个强大的图形绘制库,常用于在Java环境中创建二维图形用户界面。这个"Draw2d教程"可能包含了从基础到高级的各种概念和技术,帮助学习者深入理解如何利用Draw2d来构建交互式图形应用。以下是教程可能涵盖的...
当Draw2D与SWT结合使用时,可以在SWT的窗口或控件上绘制Draw2D图形,实现高度定制化的可视化效果。 在“在Java中使用Draw2D和SWT绘图的源码”中,我们可以学习如何将这两个库整合起来,创建动态的、交互式的2D图形...
在"Draw2d画线例子"中,我们将探讨如何利用Draw2d库来实现动态地在屏幕上绘制曲线图形。 首先,要使用Draw2d,你需要在Eclipse环境中设置好项目依赖。确保你已经安装了Eclipse IDE,并且导入了相关的插件如GEF...
Draw2D是SWT中的一个子项目,专门用于在SWT组件上进行图形绘制,提供了一组丰富的API,使得开发者可以创建出复杂的2D图形用户界面。本总结将深入探讨SWT和Draw2D在绘图方面的知识。 1. SWT基础: SWT是一个与操作...
Draw2D是Eclipse平台下的一种轻量级图形用户界面工具包,它提供了一系列用于构建复杂图表、文档或绘图的功能组件,这些组件被称为“Figure”。不同于传统的GUI组件,Figure在操作系统级别上没有对应的资源,它们完全...
在提供的"org.eclipse.draw2d.examples"目录下,我们可以看到一系列示例代码,这些代码涵盖了Draw2d的主要功能和使用场景: 1. BasicShapesExample:展示了如何创建基本形状,如Rectangle、Ellipse、Line等,并对...
Draw2d提供了一系列布局管理器,如StackLayout、TableLayout和FlowLayout,帮助自动调整图形元素的位置和大小,以适应不同场景的流程图布局需求。 4. **事件处理与交互**: 用户可以通过鼠标和键盘与流程图交互,...
无论是开发桌面应用程序还是Web应用,Draw2D都能提供强大的图形绘制支持,使得开发者能够专注于业务逻辑,而不是底层的图形实现细节。 在深入研究Draw2D时,需要注意以下几个关键点: 1. **理解基本图形对象和属性...
在代码中,我们可能会看到`IFigure`接口的实现,它是Draw2D中所有图形对象的基类。 2. **布局管理器**:在`Draw2DLayoutExample.java`中,布局管理器如`GridLayout`或`FlowLayout`被用来组织和调整图形对象的位置。...
《draw2d.js v2.9.1:绘制工作流图的前端库解析与实践》 在当前数字化时代,工作流程图的可视化设计已经成为项目管理和协作的重要工具。Draw2D.js是一个专门用于创建和编辑二维图形的JavaScript库,特别适用于绘制...
“draw2d”是Eclipse中用于2D图形绘制的库,而“examples”则意味着这个压缩包包含了一系列使用Draw2d的示例代码,用于教学和实践。 在【压缩包子文件的文件名称列表】中,我们看到只有一个条目 "org.eclipse.draw...